Есть ли функция ruby, чтобы сделать! (Val) .nil ?? - PullRequest
3 голосов
/ 19 января 2010

Я часто обнаруживаю, что делаю это:

!(val).nil?

Мой код был бы красивее, если бы существовал метод, подобный

val.exists?

Есть ли что-то подобное?

Ответы [ 5 ]

11 голосов
/ 19 января 2010

вы можете использовать оператор unless, например,

do_something unless val.nil?

, что, вероятно, очень близко к идеальному способу его выражения: если бы у вас был метод non_nil?, у вас было бы отрицательное утверждение вместо положительного, как этот.

5 голосов
/ 19 января 2010
if !val.nil?
  # do something
end

# is equivalent to

if val
  # do something
end

Если вы используете Rails, ActiveSupport предоставляет два объекта Object , которые называются Object # blank?и объект № присутствует?.

if !address.nil? && !address.empty?
# becomes
if !address.blank?
# which becomes
if address.present?
2 голосов
/ 20 января 2010

Стоит отметить, что! Val.nil? запах кода, указывающий на то, что может быть лучший способ сделать то, что вы пытаетесь сделать; возможно, код полагается на структуру данных, которая может быть заменена чем-то, что могло бы лучше обрабатывать крайние случаи.

Вот пример того, как .nil? может использоваться плохо:

Например:

blah = {}
[:a,:b,:c,:a].each do |l|
     if blah[l].nil?
         blah[l] = 0
     else
         blah[l] += 1
     end
end
blah #=> {:a => 2, :b => 1, :c =>1}

Потенциально можно переписать как

blah = Hash.new(0)
[:a,:b,:c,:a].each{|i| blah[i] += 1} #or with inject.

Оператор ||= - это еще одна область, на которую стоит обратить внимание.


УДАЛЕНО: Распространенной идиомой для выполнения чего-либо со значением, которое может быть nil, является использование оператора &&, поскольку nil - это ложь, поэтому вместо

if !val.nil?
   val.do_something
end

Обычно просто написать

val && val.do_something # =>nil if val is nil, val.do_something's value otherwise

Это требует столько же знаний о том, как nil обрабатывается в логических выражениях, сколько требуется для условного примера mckeed (x, если y), приведенного ниже, так что это на самом деле не помогает коду лучше читать.

1 голос
/ 20 января 2010

!! val

0 голосов
/ 20 января 2010
module Nonnil
  def non_nil?
    !(self.nil?)
  end
end

class Someclass
  include Nonnil
  extend Nonnil
end

Это добавит члена .non_nil? к классу Someclass, определенному как обратное .nil?. Смешайте этот модуль с классом, к которому принадлежит «val» (в вашем примере), и у вас будет удобный ярлык. Смешайте это с классом Object, и он будет доступен для каждого класса (поскольку Object является родителем всех классов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...