Ruby 在字符串外插值

Ruby interpolation outside of a string

我正在 运行 使用不同的用户凭据进行一些测试。每个都会产生相同的错误消息,但我只需要确认它是否有效。

我创建了以下内容:

def login_mrjones
  fill_in('forname', with: 'Steve')
  fill_in('surname', with: 'Jones')
  etc etc
end

我为戴维斯先生和其他一些名字做了另一个。在编写我的步骤定义时,我希望使用以下内容,场景中的变量名称为 mrjones 或 mrdavies:

When(/^I log in as "([^"]*)"$/) do |name|
   login_#{name}
end

我希望使用插值来完成方法使其通用,这一行将调用我拥有的任何 login_name 方法。

如果不是字符串,插值似乎不起作用。有什么办法可以实现吗?

你可以做到 eval("login_#{name}")

正如 Stefan 和 Jörg W Mittag 指出的那样,您应该更喜欢 public_send Klass.public_send("login_#{name}.to_s")

或者更好。为什么不添加另一个辅助方法?

def login(name)
  case name
  when 'foo'
    login_foo
  ....
  end
end