我需要在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)
第一:我实际上会说处理这种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)
但同样,有多种方法可以在这里完成工作.什么对你有用.
def fullname
[[first, *mi, last].join(" "), *suffix].join(", ")
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
826 次 |
| 最近记录: |