是否可以从带有 String 的模块执行方法? - 红宝石 2.7.1

Posted

技术标签:

【中文标题】是否可以从带有 String 的模块执行方法? - 红宝石 2.7.1【英文标题】:Is it possible to execute a method from a module with a String ? - Ruby 2.7.1 【发布时间】:2020-10-28 03:12:50 【问题描述】:

大家好。

这个问题是上一个问题的延续:

Is it possible to extend a class by using a string as a module ? - Ruby 2.7.1

原来如此。我目前正在我的 FreeBSD 12.1 工作站上使用 Ruby 2.7.1 进行一些测试。我的目标是找到一种方法来加载目录中的所有脚本。这些脚本是具有可预测名称的模块。例如,如果我有一个名为 mymodule.rb 的脚本,它将包含一个名为:Mymodule 的模块和一个方法:mymodule。因此,我可以使用数组列出目录中的所有脚本。我可以使用该列表轻松加载/要求我的所有脚本文件。在一些 .sub、.chop 或 .capitalize 的帮助下,我可以从数组的每个索引中提取我需要的内容。但是这个操作的结果总是一个字符串。问题是我无法使用字符串执行方法。以前我在用字符串中的模块名称扩展我的主类时遇到问题,但是给出了答案并解决了这个小问题。这是我的主要课程:

load "mymodule.rb"
class Myclass
  def mymethod
    var1 = "Mymodule"
    extend self.class.const_get(var1)
    var2 = "mymodule"
    #I need something here to call the method from the module.
    #puts @varmod
  end
end

a = Myclass.new
a.mymethod

这是我的模块:

module Mymodule
  def mymodule
    @varmod = "TEST"
  end
end

所以,我想知道是否有一种方法可以在 Mymodule 中执行与“扩展 self.class.const_get(var1)”相同的方法。

提前感谢您的回复!

【问题讨论】:

【参考方案1】:

我认为这是您正在寻找的 send 方法。以下应该有效:

send(var2)

【讨论】:

非常感谢您的回复,彻底解决了我的小问题!!!【参考方案2】:

要发送一个在设计时静态名称未知的消息,可以使用Object#public_send 方法:

public_send(var2)

在这种情况下没有必要使用Object#send,因为你的方法不是private

【讨论】:

以上是关于是否可以从带有 String 的模块执行方法? - 红宝石 2.7.1的主要内容,如果未能解决你的问题,请参考以下文章

Query String模块

带有类型检查的Scala相等性?

是否可以发布带有环境模块声明的包?

从 Windows 运行带有标志的可执行文件

是否可以模拟受保护的属性和方法

是否可以使用带有 Arduino 的 HM-10 或 HM-11 BLE 模块与 iOS 设备 (ANCS) 进行通信?