我在阅读一些元编程文章时遇到了这种方法。
这是基于以下链接的示例和应用程序: https://ruby-doc.org/core-2.5.1/Object.html#method-i-method
class Demo
def initialize(n)
@iv = n
end
def hello()
"Hello, @iv = #{@iv}"
end
end
k = Demo.new(99)
m = k.method(:hello)
m.call #=> "Hello, @iv = 99"
l = Demo.new('Fred')
m = l.method("hello")
m.call #=> "Hello, @iv = Fred"
我也可以执行以下代码:
k = Demo.new(99)
m = k.hello
#=> "Hello, @iv = 99"
l = Demo.new('Fred')
m = l.hello
#=> "Hello, @iv = Fred"
所以我的问题是,method()步骤的意义是什么? 只是为了简化它?
谢谢。
答案 0 :(得分:2)
这里的观点纯粹是教育性的-这是一个非常简单的示例。
.method
使您可以获取method object来附加到任何对象的方法。
例如,这可用于检查方法的定义位置:
irb(main):002:0> User.method(:find).source_location
=> ["/Users/max/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.2.1/lib/active_record/core.rb", 157]
或声明该方法的所有者:
irb(main):017:0> User.method(:find).owner
=> ActiveRecord::Core::ClassMethods
或者您可以使用它作为回调传递方法:
class Foo
def and_then_do(callback)
"Hello "
callback.call
end
def say_hello
"World"
end
end
foo = Foo.new
foo.and_then_do(foo.method(:say_hello))
关键是与Ruby中的许多其他语言不同,方法是对象,method
为您提供了可以检查的方法对象。
这也是呼叫和发送之间差异的示例,两者均可用于动态呼叫:
mn = :hello
k = Demo.new(99)
m = k.method(mn)
m.call
k = Demo.new(99)
m = k.send(mn)
在对象本身上调用发送,而在方法对象上调用。