以下是我的问题的一个简短示例。
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
?
答案 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>)
还有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
即可将字符串转换为符号。或者你可以在第一时间使用字符串。