我是 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"