rails method(sym)应用

时间:2018-09-30 08:11:38

标签: ruby-on-rails ruby

我在阅读一些元编程文章时遇到了这种方法。

这是基于以下链接的示例和应用程序: 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()步骤的意义是什么? 只是为了简化它?

谢谢。

1 个答案:

答案 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)

在对象本身上调用发送,而在方法对象上调用。