加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Ruby以编程方式调用方法,具有可变数量的args

发布时间:2020-12-17 03:42:47 所属栏目:百科 来源:网络整理
导读:我想尝试做类似的事情: def foo(mode= :serial) if (mode == :serial) then self.send(:bar,"one_type") else self.send(:bar,"second_type",:T5) endend 我显然可以这样打出来. 但我最近尝试将其扩展为包含第二个函数: def foo(mode= :serial) if (mode =
我想尝试做类似的事情:

def foo(mode= :serial)

  if (mode == :serial) then
    self.send(:bar,"one_type")
  else
    self.send(:bar,"second_type",:T5)
  end
end

我显然可以这样打出来.

但我最近尝试将其扩展为包含第二个函数:

def foo(mode= :serial)

  if (mode == :serial) then
    self.send(:bar,"one_type")
    self.send(:foobar,"one_type",20)
  else
    self.send(:bar,:T5)
    self.send(:foobar,20,:T5)
  end
end

我仍然可以继续,但我想,这里有一个模式,我应该把论点抽象到另一层,并使这更简单.

所以我想做的是这样的:

arg_arr   = [:bar,"one_type"]
arg_arr_2 = [:foobar,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

我尝试了一些涉及.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

两个都打印

bar
qux

splat运算符*打包或解包数组.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读