В средах, которые принимают логические аргументы, будет хорошей идеей обернуть все функции вместо того, чтобы позволять их неявно вызывать? - PullRequest
0 голосов
/ 12 сентября 2011

Взять, к примеру, функцию String#=~. Он вернет индекс первого совпадения, если совпадение найдено, которое, как Fixnum, всегда будет действовать как true в логических средах. Если совпадение не найдено, возвращается значение null, которое действует как ложное.

Теперь предположим, что у меня есть класс:

class A
  attr_accessor :myprop

  # prints "I am awesome" if #myprop matches /awesome/
  # and "I am not awesome" otherwise
  def report_on_awesomeness!
    puts "I am #{myprop =~ /awesome/ ? 'awesome' : 'not awesome'}."
  end
end

Этот код будет работать почти так же, как и ожидалось, но первый элемент в условном операторе пробной версии - предмет моего вопроса.

Это хорошая идея, чтобы не обернуть myprop =~ /awesome/? Я не говорю о том, чтобы абстрагировать его в другой метод, такой как def is_awesome?; myprop =~ /awesome/; end, а о том, предпочтительнее ли мое текущее соглашение, которое заставляет Ruby неявно приводить Fixnums к true, и nils к false, по сравнению с упаковкой условия во что-то, что я сам приводил. Я мог бы легко сделать это:

class A
  attr_accessor :myprop

  # prints "I am awesome" if #myprop matches /awesome/
  # and "I am not awesome" otherwise
  def report_on_awesomeness!
    puts "I am #{(myprop =~ /awesome/).nil? ? 'not awesome' : 'awesome'}."
  end
end

Плюсы, которые я вижу для первого стиля:

  • Большинство сопровождающих (включая будущего меня) привыкли к неявному типу
  • короче

Плюсы, которые я вижу для второго стиля:

  • Более очевидно, какова точная связь между результатом метода =~ и его логической интерпретацией
  • Это дает вам больше свободы в использовании более творческого и явного приведения

Я подозреваю, что может быть какое-то среднее положение, когда вы оставляете неявные преобразования типов в случаях, когда это идиоматично (например, сопоставление регулярного выражения с использованием =~), и делаете это явно, когда это не так (например, ваши собственные свойства, особенно если они имеют несколько типов возврата).

Буду признателен за любую информацию или опыт сообщества по этому вопросу.

1 Ответ

0 голосов
/ 12 сентября 2011

ИМХО это личный выбор.Вы можете выбрать любой стиль, так как вам легче работать с ним.

Как только я определил true? для Object, чтобы получить его логическое значение (другое имя может быть to_bool):

class Object
  def true?
    !!self
  end
end

Но двойной взрыв (!!) проще преобразовать в булево, и я предпочитаю его использовать - но не везде.Я использую его только тогда, когда мне нужна explicity логическое значение (я бы не использовал его в случае этого вопроса).

BTW, false.nil? == false;это может привести к путанице.

...