如果变量为nil,则赋值字符串,否则附加

Duc*_*yen 3 ruby ruby-on-rails

我正在尝试缩短此代码:

if a.nil?
  a = "foo"
else
  a << "foo"
end
Run Code Online (Sandbox Code Playgroud)

a是一个nil或一个字符串.

我已经尝试了a ||= "foo",a += "foo"但如果a是这些则不起作用nil.

Urs*_*sus 9

nil.to_s是等于''你可以写

a = a.to_s + 'foo'
Run Code Online (Sandbox Code Playgroud)

或者,替代方案

a = "#{a}foo"
Run Code Online (Sandbox Code Playgroud)

  • 如果你不需要,不要"救援".一个更好的选择是`a ="#{a} foo"`. (2认同)

Ste*_*fan 5

在您的情况下可能无关紧要,但是a +=和之间有区别a <<

+=为分配一个新字符串a,而旧字符串则保持不变:

a = 'abc'
b = a

a += 'foo'

a #=> "abcfoo"   # <- a refers to the new string object
b #=> "foo"      # <- b still refers to the original string
Run Code Online (Sandbox Code Playgroud)

这是因为String#+返回一个字符串。a += 'foo'等同于a = a + 'foo'

String#<<另一方面,修改现有的字符串,不会创建新的字符串:

a = 'abc'
b = a

a << 'foo'

a #=> "abcfoo"
b #=> "abcfoo"   # <- both changed, because a and b refer to the same object
Run Code Online (Sandbox Code Playgroud)

因此,为了缩短代码而不改变其行为,可以使用:

(a ||= '') << 'foo'
Run Code Online (Sandbox Code Playgroud)

a ||= ''指定一个空字符串a,如果anil。然后<< 'foo'附加'foo'a