为什么方法声明在ruby中评估为nil?

时间:2013-03-19 22:08:03

标签: ruby methods

定义一个方法似乎没有评估为真值,因为可以通过将一个放入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

4 个答案:

答案 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语句。