2011-01-22 2 views
0

Есть ли в Ruby операторы, похожие на «OrElse» и «AndAlso» в VB.NET?Операторы Ruby-эквивалента в «OrElse» и «AndAlso» Vb.net

Например, в исключения рубин NoMethodError возникает, когда active_record равна нулю:

if active_record.nil? || active_record.errors.count == 0 
    ... 
end 

В VB.net я могу сделать:

If active_record Is Nothing OrElse active_record.errors.count = 0 
    ... 
End 

Это не генерирует исключение, потому что он проверяется только первое выражение

+0

является 'active_record' в вашем коде фактической библиотеки или примере объекта active_record? –

+0

в этом примере active_record - это объект, который может быть nil – Sebtm

+0

Не знаю, почему вы погладили ваши фразы. В последнем случае правильным будет то, что в VB.NET второе выражение оценивается только в том случае, если оно сначала ложно. [Это короткое замыкание] (http://en.wikipedia.org/wiki/Short-circuit_evaluation), то же самое происходит с Ruby '&&' и '||'. –

ответ

3

В этом случае исключение исключений не будет d (потому что только первый член в || будут оцениваться). Однако вам может быть интересно прочитать около Object#try из ActiveSupport, что может быть полезно при работе с объектами, которые могут быть ноль.

+0

Вы правы. В моем коде была проблема.Оценивается только первый член. – Sebtm

+1

В чем была проблема? –

1

Ruby || является оператором short circuit evaluation, поэтому он должен оценивать только первое условие, поэтому ваш if не должен вызывать никаких исключений.

Предполагаю, что active_record.nil? возвращает boolean true.

1

В рубине есть большая разница между тем, что ничто и что-то, что не определено. Учитывая следующее, из IRB:

ruby-1.9.2-p0 :002 > active_record 
NameError: undefined local variable or method `active_record' for main:Object 
    from (irb):2 
    from /Users/jed/.rvm/rubies/ruby-1.9.2-p0/bin/irb:16:in `<main>' 
ruby-1.9.2-p0 :003 > active_record = nil 
=> nil 
ruby-1.9.2-p0 :004 > active_record.class 
=> NilClass 
ruby-1.9.2-p0 :006 > active_record.nil? 
=> true 

Таким образом, объект, который равен нулю является экземпляром NilClass и поэтому отвечает на сообщение nil? возвращает истину, но без объявления переменной (как в вашем коде) Рубиновый Безразлично Я не знаю, что вы называете.

Несколько вариантов здесь: || оператор

Руби является строгим оператором, в то время как or ключевое слово менее строгим, так что я не знаю, где операция VB сравнивает эти два или потока опций.

вы могли бы использовать аккуратный небольшой драгоценный камень callled «andand»

require 'andand' 
active_record.andand.errors.count == 0 

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

@post = Post.new(:my_key => "my value") #=> an ActiveRecord object 
if @post.valid? 
    # do something meaningful 
else 
    puts @post.errors.full_messages.to_sentence 
end 

и если вы имеете в виду что-то назначить на основе, если это возможно, не определенно, вы хотели бы использовать запоминание:

@post ||= Post.new 

, который объявит объект, если не определено или использует существующий объект.

Смежные вопросы