Ruby中的运算符类似于VB.NET中的“OrElse”和“AndAlso”?
例如在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
这不会产生异常,因为只检查了第一个表达式
答案 0 :(得分:3)
在这种情况下,不会引发异常(因为只会评估||中的第一个术语)。但是,您可能有兴趣阅读ActiveSupport中的Object#try,这在处理可能为零的对象时会很有用。
答案 1 :(得分:1)
Ruby ||
是short circuit evaluation运算符,因此它应仅评估第一个条件,因此if
不应引发任何异常。
我假设active_record.nil?
返回布尔值true
。
答案 2 :(得分:1)
在ruby中,nil和未定义的东西之间存在很大差异。考虑以下因素,来自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不知道你在调用什么。
这里有几个选项:
Ruby的||
运算符是严格运算符,而or
关键字不太严格,所以我不知道vb操作与这两个或流选项的比较。
你可以使用一个叫做'andand'
的整洁小宝石require 'andand'
active_record.andand.errors.count == 0
但是,通常当您在rails中处理这种情况时,您将使用其他方法来确定上述情况,请考虑:
@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
如果你想根据它是否可能未定义来分配某些东西,你会想要使用memoization:
@post ||= Post.new
如果未定义则声明对象或使用现有对象