我需要在Ruby中解决一个简单的问题,但希望以一种聪明的方式来解决它。我有一个功能:
def fullname
first + " " + mi + last
end
如果一个或多个变量为nil
,那将会崩溃,让我们说这个例子的mi,因为它在中心。
错误:
无法将nil转换为String
如果我将功能更改为:
def fullname
first + " " + mi.to_s + last
end
或
def fullname
first + " " + (mi || "") + last
end
它会修复它。现在我想在mi(中间首字母)之后添加一个额外的空格(如果它存在)并且我为了一些愚蠢的理由而难以接受。做这样的事最干净的方法是什么,因为我将不得不做很多事情,有时还会加上逗号。
需要的例子:
def fullname
first + " " + (mi || "") + last + suffix
# want a ", " afer the last name if there is a suffix
end
答案 0 :(得分:8)
首先:我实际上会说处理这种问题的最“Ruby”方式 - 避免nil
问题,就是使用字符串插值:
"#{first} #{mi} #{last}"
如果以上任何变量都是nil
,这样就可以了,因为它只会导致字符串中的空格。
关于条件空间问题:有很多方法可以让那只猫受到伤害。我非常喜欢sawa's idea。这是另一个,我见过它的变体,虽然它不是特别有效(但是10次中有9次并不重要):
[first, mi, last].compact.join(" ")
最后:对于“加号逗号+后缀(如果存在)”要求,这很复杂,我建议写一个小方法来分离逻辑:
def suffix_if_necessary(name)
suffix ? "#{name}, #{suffix}" : name
end
def fullname
suffix_if_necessary([first, *mi, last].join(" "))
end
但同样,有很多方法可以在这里完成工作。什么对你有用。
答案 1 :(得分:7)
def fullname
[[first, *mi, last].join(" "), *suffix].join(", ")
end
答案 2 :(得分:1)
我建议您使用字符串插值来清楚地表明您从该方法返回一个字符串(并且还会忽略nil
个值):
def fullname
s = "#{first} #{mi} #{last}".lstrip.rstrip.squeeze(' ')
s += ", #{suffix}" if suffix
end