Joh*_*aou 6 ruby instance-method programmatically
我正在尝试做类似的事情:
def foo(mode= :serial)
if (mode == :serial) then
self.send(:bar, "one_type")
else
self.send(:bar,"second_type",:T5)
end
end
Run Code Online (Sandbox Code Playgroud)
我显然可以这样输入。
但我最近尝试将其扩展为包含这样的第二个功能:
def foo(mode= :serial)
if (mode == :serial) then
self.send(:bar, "one_type")
self.send(:foobar, "one_type",20)
else
self.send(:bar,"second_type",:T5)
self.send(:foobar, "one_type",20,:T5)
end
end
Run Code Online (Sandbox Code Playgroud)
我仍然可以按原样继续,但我对自己想,这里有一个模式,我应该将参数抽象到另一个层中并使这更简单。
所以我想做的是这样的:
arg_arr = [:bar, "one_type"]
arg_arr_2 = [:foobar, "one_type", 20]
if (mode == :serial) then
self.send(arg_arr)
self.send(arg_arr_2)
else
arg_arr << :T5
arg_arr2 << :T5
self.send(arg_arr)
self.send(arg_arr2 )
end
Run Code Online (Sandbox Code Playgroud)
我尝试了一些涉及 .each、.inspect 的其他想法,但没有任何效果(通常的错误是无法将数组转换为字符串,我猜这是指它将数组视为整个函数名称的事实) . 如果我明确说“使用数组元素[0]、[1]等,我可以做到,但这似乎很浪费。
有没有办法在不编写硬编码到参数数量的代码的情况下实现这一目标?
尝试这个
def foo(a, b)
puts a
puts b
end
array = ['bar', 'qux']
send(:foo, *array) # using send
foo(*array) # using the method name
Run Code Online (Sandbox Code Playgroud)
都打印
bar
qux
Run Code Online (Sandbox Code Playgroud)
splat 操作符*打包或解包一个数组。
| 归档时间: |
|
| 查看次数: |
2021 次 |
| 最近记录: |