为什么这是使用 concat 运算符

  • 本文关键字:concat 运算符 ruby
  • 更新时间 :
  • 英文 :


我是 ruby 的新手,但我很确定这些东西是等价的。但我正在为一个重要的剧本创造机会,只是想确定一下。

这就是他们现在拥有的:

def generate_names options
names = []
name = options.name
sen = options.sen
ari = options.ari
options.targets.each do |target|
names << "#{name}" + " Test " + "#{target}"
end
names
end

这就是我想将其更改为的内容,请注意我删除+names <<行。这是完全一样的吧?我什至做了一个关于平等的测试,但只是想确定一下。

def generate_names options
names = []
name = options.name
sen = options.sen
ari = options.ari
options.targets.each do |target|
names << "#{name} Test #{target}"
end
names
end

除此之外,我在irb中尝试过这个,但它给出了错误:

"#{name}" + " Test " + "#{target}".eql?("#{name} Test #{target}") ? "equal" : "not"

给出的错误是:

TypeError: no implicit conversion of false into String
from (irb):20:in `+'
from (irb):20
from /usr/bin/irb:12:in `<main>'

单独看一下:

names << "#{name}" + " Test " + "#{target}"

这确实是不规则的代码。 如果这是一个字符串值,"#{name}"将等效于name,因此引号是无关紧要的,更糟糕的是,创建另一个立即被抛出的字符串。这一行单独创建四个字符串。

另一个更好:

names << "#{name} Test #{target}"

这将创建一个字符串并将其插入。插值几乎总是比串联更好,因为它产生的垃圾更少。

您的irb测试存在缺陷:

"#{name}" + " Test " + "#{target}".eql?("#{name} Test #{target}") ? "equal" : "not"

这将首先在target上评估.eql?部分,这显然不是匹配项,因此它计算为:

("#{name}" + " Test " + false) ? "equal" : "not"

这将失败,因为您无法将false和字符串组合在一起。

测试此方法是强制特定的评估顺序:

("#{name}" + " Test " + "#{target}").eql?("#{name} Test #{target}") ? "equal" : "not"

最新更新