是否可以从带有 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的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用带有 Arduino 的 HM-10 或 HM-11 BLE 模块与 iOS 设备 (ANCS) 进行通信?