LINUX.ORG.RU

Идиома (value || default_value) в виде метода

 ,


0

1

Посмотрел на строку кода в проекте и подумал — нечитабельно, нужно переписать как цепочку методов:

    topic = ((ktp.get_topics(name) || [])[count]) || ""

Запилил обёртку:

class Object
    def or_else(v = nil)
        if nil?
            if block_given?
                yield(v)
            else
                v
            end
        else
            self
        end
    end
end

Исправил код:

    topic = ktp.get_topics(name).or_else{[]}[count].or_else{""}

Типа, теперь всё читабельно.

Неужели такого удобного метода нет в стандартной библиотеке? Или он есть, но это я до сих пор не знаю?

Deleted

Читал очень вскользь, а ||= не подойдёт?

spijet ★★★
()

Как был говно код так и остался

oster2011 ★★★
()
Ответ на: комментарий от r0ck3r

а что в этом руби нет тернарного оператора?

Предлагаешь сделать код еще длиннее и нечитабельнее?

Deleted
()

По-моему изначальная строка нечитабельна тупо из-за того, что там влеплено 2 сравнения сразу. И потому обёртка особо ситуации не исправила - как был нечитаемый паровоз, так и остался. ИМХО стоит ввести временную переменную и разбить строку на две.

Не рубист ни разу, прост мимокрокодил еслишо.

Reineke
()

Читабельность - понятие субъективное. Я бы сделал функцию NVL(x,y) или if_nil(x,y), возвращающую первый не пустой аргумент.

MyLord
()

Хули вы там экономите?

topics = ktp.get_topics(name) || []
topic = topics.fetch(count, "")

А ещё лучше, если get_topics точно будет возвращать пустой массив.

anonymous
()
Ответ на: комментарий от bvn13

var a = b || c;

Так подобное сегодня много где есть, это вполне уже норма.

$a = $b ?: $c; // редуцированное $a = $b ? $b : $c;


var a = b or c


и т.п.

Да и топикстарт тем же подходом польуется.

KRoN73 ★★★★★
()
Последнее исправление: KRoN73 (всего исправлений: 1)

Типа, теперь всё читабельно.

Исходный вариант тут читается легче :)

KRoN73 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.