为什么“#{String}”是Ruby中常见的习语

时间:2010-05-10 21:00:29

标签: ruby string

我认识的Ruby开发者问过这个问题;我的答案如下......还有其他更好的理由吗?

为什么这么多Ruby程序员会这样做

"#{string}"

而不是

string

因为第二种形式更简单,更有效率?

8 个答案:

答案 0 :(得分:12)

这是Ruby开发人员的常用习惯吗?我没有那么看。

答案 1 :(得分:3)

当你以后需要做的不仅仅是简单地获取字符串的值,而且在使用点前置/附加它时,更小的变化似乎是我能找到的最好的动机。

答案 2 :(得分:3)

只有一种情况,这是推荐的习语:

fname = 'john'
lname  = 'doe' 
name = "#{fname} #{lname}"

上面的代码比以下代码更有效:

name = fname + ' ' + lname

name = [fname, lname].join(' ')

答案 3 :(得分:2)

某些用法的更广泛背景是什么?除了已经提到的内容之外,我唯一能想到的就是对类型安全的宽松尝试;也就是说,你可以收到任何作为参数的东西,这可以确保你传递的任何东西都像鸭子一样走路......或者,一个字符串(虽然string.to_s可以说更清晰)。

总的来说,这可能是一种代号味道,一路上有人认为是最佳实践。

答案 4 :(得分:2)

我使用这种代码,因此我可以将nil作为字符串传递,它仍然可以在字符串上工作,而不是看到一些异常飞行:

def short(string = nil)
  "#{string}"[0..7]
end

如果它已经在引号中,那么附加一些调试代码会更容易/更快。

简而言之:它更方便。

答案 5 :(得分:0)

也许这很容易将any转换为字符串?因为它与call to_s方法相同。但这很奇怪:)。

a = [1,2,3]
"#{a}"
#=> "123"
a.to_s
#=> "123"

答案 6 :(得分:0)

有趣的答案,每个人。我是问原问题的开发人员。为了给出更多的上下文,我偶尔会在当前的工作中看到这一点,有时也会在Rails列表中的示例代码中看到这些变量,这些变量预先知道包含字符串。我可以理解它作为to_s的替代品,但我不认为这是在这里发生的事情;我想如果你只是传递一个字符串变量,人们就会忘记你不需要插值语法。

如果有人试图告诉我这是最好的做法,我会以最快的速度逃跑。

答案 7 :(得分:0)

我可以想象这对于插值对象并不总是String的情况很有用,因为插值隐式调用#to_s

"#{'bla'}"           => "bla"
"#{%r([a-z])}"       => "(?-mix:[a-z])"
"#{{:bla => :blub}}" => "blablub"

在记录某些东西时可能有意义,你不关心输出格式,但由于参数类型错误,从不想要错误。