定义一个方法似乎不会评估为一个真实的值,这可以通过将一个放在一个if
条件中来检查:
if(def some_method; puts "random text"; end) then
puts "declaration evaluates to true"
else
puts "declaration evaluates to false"
end
# => declaration evaluates to false
为什么/如何将方法声明评估为nil
?
它实际上评估为nil
。这是有道理的;为什么方法创建会返回任何东西?
irb(main):001:0> def test; print 'test'; end
=> nil
但是,它必须返回一些东西,所以返回“无”就是返回nil
。
Ruby 中的每条语句都会计算出一些东西。该def
语句的值不应该被检查,因此是nil
.
您将在反射“元编程”方法中找到您正在寻找的行为define_method
。
class EmptyClass
m = define_method(:newmethod) {p "I am the new method"}
p m # => <Proc:0x50b3f359@E:\NetBeansProjects\RubyApplication1\lib\main.rb:6>
end
从红宝石陷阱:
非布尔数据的布尔评估是严格的:0、"" 和 [] 都被评估为真。在 C 中,表达式 0 ? 1 : 0 评估为 0(即错误)。然而,在 Ruby 中,它产生 1,因为所有数字都为真;只有 nil 和 false 评估为 false。这条规则的一个推论是 Ruby 方法按照约定——例如,正则表达式搜索——成功时返回数字、字符串、列表或其他非 false 值,但失败时返回 nil。此约定也用于 Smalltalk,其中只有特殊对象 true 和 false 可以在布尔表达式中使用。
方法定义,例如def some_method; puts "random text"; end
总是返回nil。
现在,这意味着该方法被评估为nil。根据 Ruby 文档:
如果 obj 为 nil 或 false,则返回 false;否则为真。
由于您的方法返回nil,因此if会将其评估为false因此执行 else 语句。