Ruby 的设计理念令人惊叹。所以我做了 1 + 2
并得到了 3
。我设法做到了:1.+(2) # => 3
。
虽然这很酷,但我还想在 +
方法上测试 class
方法。
+.class
=> SyntaxError: (irb):14: syntax error, unexpected '.'
+.class
^
然后:
+().class
=> NoMethodError: undefined method `+@' for NilClass:Class
同时:
+(2).class
NoMethodError: undefined method `+@' for Fixnum:Class
为什么 +(2).class
是 fixnum 而不是整数?我用 +(2.to_i).class
再试一次,+(2).class
出现同样的错误。
但是回到关键问题:如何找到+
方法的类?
最佳答案
1 + 2
以 2
作为参数调用 1
上的 +
方法,这是与 1.+(2)
相同。
但是,由于优先级的关系,+(2).class
实际上是先调用(2).class
,返回一个Class
的实例>,然后调用不存在的+@
方法,这是只存在于Numeric
的一元加法。您可以通过键入 (+(2)).class
来测试它,它会像预期的那样返回 Fixnum
。这也是+().class
的错误来源,因为()
返回的是nil
,而nil的类
是 NilClass
,它也没有 +@
方法。
tl;dr:因为优先级使得前导 +
最后计算,如 +@
。
任何对象上的 +
方法都属于 Method
类,任何对象上的任何其他方法也是如此。但是,键入 +
会调用方法而不是返回方法,因为 Matz 在梦中看到返回方法而不是调用方法的编程语言不会运行。您可以通过使用方法名称调用 method
方法来将方法返回给您,如下所示:1.method(:+)
。然后你可以让方法对象告诉你它的类是什么:1.method(:+).class
。
关于ruby-on-rails - 如何在 Ruby 中查找 + 的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22603851/