繁体   English   中英

ruby - 如何在模块中动态调用实例方法

ruby - how to dynamically call instance method in a module

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在尝试动态调用实例方法。 我发现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

1 个回复

免责声明:糟糕的做法,它几乎没有任何意义:

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%而不是一个:)

3 如何从Ruby中的模块覆盖现有实例方法?

我知道我可以向模型中添加新方法,但似乎无法覆盖现有方法。 这就是我所拥有的 在我的User.rb中 在我的模块中 我想让插件中的方法覆盖模型中的方法。 任何想法或参考都很好,似乎找不到很好的参考。 谢谢! Ĵ ...

5 如何创建“实例”。“方法”调用-Ruby on Rails

我在RoR方面还很陌生,现在我正面临一个问题。 我正在实施一个出勤系统,并且应用程序中有事件资源。 我想做的是可以调用event.color(在Event的实例上)并找回经典的CSS颜色字符串(如#2EAC6A)。 如果可能的话,我不想在数据库中创建新的列或表。 这意味着最好由红宝石本身 ...

6 如何从其他Ruby文件的模块调用方法

我必须使用Ruby文件:一个包含一个包含一些用于统计计算的方法的模块,在另一个文件中,我想调用该模块中的一个方法。 如何在Ruby中做到这一点? 那是正确的方法吗? ...

7 为什么我不能从另一个模块调用实例方法来初始化 ruby​​ 中的 lambda?

我正在尝试重构现有代码以简化。 最初我是在调用模块方法,就像 java 中的静态实用程序方法一样。 这是新代码: 如果简单地将Module1的代码复制到Module2我就可以使它工作。 有更好的解决方案吗? 编辑:此外,我应该能够从直接包含它的类中调用Module1方法。 例如: 实际模 ...

9 使用模块而不是继承重写Ruby中的实例方法

我正在尝试实现一个覆盖ActiveRecord方法(查找)的方法,但随后也可以访问原始的find方法。 我想使用模块在不继承的情况下进行此操作。 所以我要寻找的是这样的: 然后在我的ActiveRecord继承的类中 这可能吗? 目的是要有一个简单的插件来增强ActiveR ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM