3

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

def fullname
  first + " " + mi + last
end

如果一个或多个变量是 ,那将会崩溃nil,假设这个例子中的 mi 因为它在中心。

错误:

无法将 nil 转换为字符串

如果我将功能更改为:

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
4

3 回答 3

9

首先:我实际上会说,处理这个问题的最“Ruby”方式——即避免这个nil问题——将是使用字符串插值

"#{first} #{mi} #{last}"

如果上述任何变量是 ,这工作得很好nil,因为它只会导致字符串中的空格。

至于条件空间问题:有很多方法可以剥去那只猫的皮。我真的很喜欢sawa的想法。这是另一个,我见过它的变体,虽然它不是特别有效(但 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

但同样,有多种方法可以在这里完成工作。什么都适合你。

于 2013-07-23T15:39:25.393 回答
7
def fullname
  [[first, *mi, last].join(" "), *suffix].join(", ")
end
于 2013-07-23T15:40:27.780 回答
1

我建议您使用字符串插值来明确您正在从该方法返回一个字符串(并且还将忽略nil值):

def fullname
    s = "#{first} #{mi} #{last}".lstrip.rstrip.squeeze(' ')
    s += ", #{suffix}" if suffix
end
于 2013-07-23T16:25:10.147 回答