Руби эквивалентные операторы в «OrElse» и «AndAlso» Vb.net - PullRequest
0 голосов
/ 22 января 2011

В Ruby есть операторы, похожие на "OrElse" и "AndAlso" в VB.NET?

.

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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 22 января 2011

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

1 голос
/ 22 января 2011

в ruby, есть большая разница между чем-то, что является нулем, и чем-то, что не определено.Учитывая следующее, из 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 

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

Здесь есть несколько вариантов:

Оператор Ruby || является строгим, тогда как ключевое слово or менее строгое, поэтому я не знаю, где операция vb сравнивается сэти два или варианты потока.

вы могли бы использовать аккуратный маленький драгоценный камень под названием ' 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 

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

1 голос
/ 22 января 2011

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

Я предполагаю, active_record.nil? возвращает логическое значение true.

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