1

定义一个方法似乎不会评估为一个真实的值,这可以通过将一个放在一个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

4 回答 4

5

它实际上评估为nil。这是有道理的;为什么方法创建会返回任何东西?

irb(main):001:0> def test; print 'test'; end
=> nil

但是,它必须返回一些东西,所以返回“无”就是返回nil

于 2013-03-19T22:09:35.327 回答
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
于 2013-03-19T22:44:32.717 回答
1

红宝石陷阱

非布尔数据的布尔评估是严格的:0、"" 和 [] 都被评估为真。在 C 中,表达式 0 ? 1 : 0 评估为 0(即错误)。然而,在 Ruby 中,它产生 1,因为所有数字都为真;只有 nil 和 false 评估为 false。这条规则的一个推论是 Ruby 方法按照约定——例如,正则表达式搜索——成功时返回数字、字符串、列表或其他非 false 值,但失败时返回 nil。此约定也用于 Smalltalk,其中只有特殊对象 true 和 false 可以在布尔表达式中使用。

于 2013-03-19T22:12:05.497 回答
1

方法定义,例如def some_method; puts "random text"; end总是返回nil

现在,这意味着该方法被评估为nil。根据 Ruby 文档:

如果 obj 为 nil 或 false,则返回 false;否则为真。

由于您的方法返回nil,因此if会将其评估为false因此执行 else 语句。

于 2013-03-19T22:47:26.507 回答