簡體   English   中英

ruby - 如何在模塊中動態調用實例方法

[英]ruby - how to dynamically call instance method in a module

我正在嘗試動態調用實例方法。 我發現sendcalleval這樣做。 有動態調用類方法的例子,但我還沒有弄清楚如何讓它適用於實例方法。

例如

module MyModule
  def Foo
    puts "hello"
  end
end

實例方法名稱可以列出:

MyModule.instance_methods
#=> [:Foo]

但我無法弄清楚如何調用該方法:

MyModule.send("Foo")
#=> NoMethodError: undefined method `Foo' for MyModule:Module

MyModule.method("Foo").call
#=> NameError: undefined method `Foo' for class `Module'

eval 'MyModule.Foo'
#=> NoMethodError: undefined method `Foo' for MyModule:Module

如何通過方法名稱調用實例方法,如Foo

免責聲明:糟糕的做法,它幾乎沒有任何意義:

MyModule.instance_method(:Foo) # #<UnboundMethod: MyModule#Foo>
        .bind(Object)          # #<Method: MyModule#Foo>
        .call                  #=> hello

您無法調用未綁定的方法,因此必須先將其綁定到某個對象。

參考文獻:


如果你使用方法單例方法會容易得多:

module MyModule
  def self.Foo
    puts "hello"
  end
end

MyModule.Foo
#=> "hello"

另一個選擇是使用module_function (在使用此選項時讀取方法對包含對象的可見性):

module MyModule
  def Foo
    puts "hello"
  end
  module_function :Foo
end

MyModule.Foo
#=> "hello"

還有一個是使用extend self

module MyModule
  def Foo
    puts "hello"
  end

  extend self
end

MyModule.Foo
#=> "hello"

PS在方法名稱中使用大寫字母並不常見。 在Ruby中它是非常罕見的情況,它可以使用,你的情況是100%而不是一個:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM