定义一个方法似乎没有评估为真值,因为可以通过将一个放入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
?
答案 0 :(得分:5)
它实际上评估为nil
。这是有道理的;为什么方法创建会返回什么?
irb(main):001:0> def test; print 'test'; end
=> nil
然而,它必须返回一些东西,所以返回“无”将返回nil
。
答案 1 :(得分:2)
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
答案 2 :(得分:1)
来自Ruby gotchas:
非布尔数据的布尔值评估是严格的:0,“”和[]都被评估为true。在C中,表达式0? 1:0评估为0(即假)。然而,在Ruby中,它产生1,因为所有数字都评估为真;只有nil和false评估为false。这个规则的必然结果是按惯例的Ruby方法 - 例如,正则表达式搜索 - 在成功时返回数字,字符串,列表或其他非假值,但在失败时返回nil。此约定也用于Smalltalk,其中只有特殊对象true和false可以在布尔表达式中使用。
答案 3 :(得分:1)
def some_method; puts "random text"; end
等方法定义始终返回 nil 。
现在,这意味着该方法被评估为 nil 。根据Ruby文档:
如果obj为nil或false,则返回false;是的,不然。
由于您的方法返回 nil ,如果会将其评估为 false ,因此请执行else语句。