从变量名称加载函数(Ruby)

时间:2018-04-19 06:48:46

标签: ruby function variables

以下是我的问题的一个简短示例。

prefix = "!"
commands = ["right"]
response = nil

message = "Some text !right here"

for i in 0..commands.length
    if message.include?(prefix + commands[i]) # If message contains "!right"
        response = commands[i](parameter) # Load matching function
    end
end

if response
    puts(response)
end

def right(parameter)
    "This is an example response"
end

为什么我不能像这样加载函数right

1 个答案:

答案 0 :(得分:1)

首先,数字for循环通常不用于ruby。你可以写

commands.each do |command|
    ...
end

至于调用“函数”,你需要知道ruby中不存在这样的函数,只有方法(理论上只是函数的一个特例)。

要在对象上调用方法,可以使用send方法,“发送”(读取:调用)“消息”(读取:方法名称)到对象

send方法将符号作为其参数,实际上它只是一个实习字符串,但您应该使用它们与普通字符串不同。

最后但并非最不重要的是,如何在任何类之外编写def来定义函数,但它仍然是某种方法?那是因为Ruby几乎将整个代码包装在一个隐式对象中。

在实践中,你最好使用lambda,它实际上只是一个带有call方法的对象,它模拟了第一类函数,你可以从javascript,lua等知道它们。

用于定义一个句法的语法糖是whatever = lambda { |argument| puts "I'm a lambda" }whatever = ->(argument){ puts "I'm a lambda too" }

do |argumetn| ... some lines of code ... end语法也可以与lambda->符号一起使用。

然后,您可以使用whatever.call(<argument>)

调用lambda

还有Procs,就像lambdas,但有一些差异,如果你想知道它们到底是什么,我建议你去谷歌。

假设每个命令是一个lambda(或proc),要将每个命令分配给一个字符串,我建议只使用一个哈希(读取:map或dict)。

它们的定义如下:

my_map_variable = {
    20 => "I'm an integer",
    "string" => "I'm a string",
    :symbol => "I'm a symbol, an interned string",
    symbol2: "I'm the same as above, but with fancy notation",
    right: -> (parameter) { puts "This is an example response" }
}

然后,您可以访问这样的值

puts my_map_variable[20] # prints: I'm an integer
puts my_map_variable[:symbol2]
puts my_map_variable[:right].call(nil) # prints: "This is an example response"

最后,如果您有一个字符串"right",但您的哈希使用符号索引,则只需调用"right".to_sym即可将字符串转换为符号。或者你可以在第一时间使用字符串。