Ruby连接最佳实践

Mec*_*Dog 3 ruby

我需要在Ruby中解决一个简单的问题,但希望以一种聪明的方式来解决它.我有一个功能:

def fullname
  first + " " + mi + last
end
Run Code Online (Sandbox Code Playgroud)

如果一个或多个变量是nil,那就会崩溃,让我们说这个例子的mi,因为它在中心.

错误:

无法将nil转换为String

如果我将功能更改为:

def fullname
  first + " " + mi.to_s + last
end
Run Code Online (Sandbox Code Playgroud)

要么

def fullname
  first + " " + (mi || "") + last
end
Run Code Online (Sandbox Code Playgroud)

它会解决它.现在我想在mi(中间首字母)之后添加一个额外的空格,如果它存在的话我会因为一些愚蠢的原因而难倒.做这样的事最干净的方法是什么,因为我将不得不做很多事情,有时还会加上逗号.

需要的例子:

def fullname
  first + " " + (mi || "") + last + suffix 
  # want a ", " afer the last name if there is a suffix
end
Run Code Online (Sandbox Code Playgroud)

Dan*_*Tao 8

第一:我实际上会说处理这种nil问题的最"Ruby"方式 - 避免问题,那就是使用字符串插值:

"#{first} #{mi} #{last}"
Run Code Online (Sandbox Code Playgroud)

如果上面的任何变量都是这样的话nil,这很好用,因为它只会导致字符串中出现空格.

关于条件空间问题:有很多方法可以给那些猫皮肤.我真的很喜欢sawa的想法.这是另一个,我见过它的变体,虽然它不是特别有效(但是10次中有9次并不重要):

[first, mi, last].compact.join(" ")
Run Code Online (Sandbox Code Playgroud)

最后:对于"加上逗号+后缀(如果存在)"的要求,这很复杂,我建议写一个小方法来分离逻辑:

def suffix_if_necessary(name)
  suffix ? "#{name}, #{suffix}" : name
end

def fullname
  suffix_if_necessary([first, *mi, last].join(" "))
end
Run Code Online (Sandbox Code Playgroud)

但同样,有多种方法可以在这里完成工作.什么对你有用.


saw*_*awa 7

def fullname
  [[first, *mi, last].join(" "), *suffix].join(", ")
end
Run Code Online (Sandbox Code Playgroud)