Vb.net的“OrElse”和“AndAlso”的Ruby等效运算符

时间:2011-01-22 11:32:33

标签: ruby operators

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

这不会产生异常,因为只检查了第一个表达式

3 个答案:

答案 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 

如果未定义则声明对象或使用现有对象