2013-07-23 147 views
3

我需要解决Ruby中的一个简单问题,但希望以一种巧妙的方式实现它。我有一个函数:Ruby连接最佳实践

def fullname 
    first + " " + mi + last 
end 

这将崩溃,如果一个或多个变量是nil,让我们说英里的这个例子,因为它是在中心。

错误:

can't convert nil into 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 
+1

你不应该依靠具有定义模式的全名:http://www.w3.org/International/questions/qa-personal-names –

+2

@DamienMATHIEU:婴儿的脚步,我的朋友。 OP是一个自我描述的新手;不要压倒他;) –

+0

谢谢你,110%的人知道这还没有国际化。在我想通过这座桥之前,需要先弄清楚这些基础知识。感谢您的文章,绝对是我需要阅读和理解的东西! – MechDog

回答

7
def fullname 
    [[first, *mi, last].join(" "), *suffix].join(", ") 
end 
+0

哇,这是否工作?如果是这样,这是一个巧妙的把戏! –

+0

这对空间非常有用,谢谢!有没有一种调整可以让它成为一个空间有时候或其他时候逗号?我会更新我的问题以更好地反映这一点。 – MechDog

+0

对不起,我的评论被删除。我正在构建您的优秀示例,并且可能看起来像是在问我的代码是否糟糕时,您的代码是否不好。感谢您的帮助!!!!! – MechDog

8

首先:我实际上说,处理这种回避的nil问题的最“红宝石”的方式,即,是使用字符串插值

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

这个工程的情况下,就好了上述任何变量是nil,因为它只会导致空白的ST环。

至于条件空间问题:有很多方法去皮肤那个猫。我真的很喜欢sawa's idea。下面是另一个,这是我见过的变种,虽然这不是特别有效(但9次了10年,这并不重要):

[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 

但同样,也有多种方式到达这里完成这项工作。无论什么对你有用。

+0

确实看起来更干净。我是否正确思考如果没有mi变量,第一个和最后一个名称之间会有两个空格而不是一个? – MechDog

+0

@MechDog:是的,这是正确的。我只是更新了答案,以满足您对条件间隔的要求。正如我承认的那样,这并不是特别有效。但由于这些只是三个小字符串,所以性能和内存影响应该可以忽略不计。 –

+0

感谢您的帮助!这两种解决方案似乎都有效,我相信每个解决方案都有它的位置。感谢您帮助这个新手走出堵塞点!从你和@sawa学到了一堆,我非常感谢你们的时间和精力! – MechDog

1

我建议你使用串插要想清楚,你是从该方法返回一个字符串(也将忽略nil值):

def fullname 
    s = "#{first} #{mi} #{last}".lstrip.rstrip.squeeze(' ') 
    s += ", #{suffix}" if suffix 
end 
+0

如何处理可选的'suffix'? – sawa

+0

你说这不是神秘吗? – sawa

+0

@sawa,关于这个最神秘的事情是'String#+ ='方法。这也不是迭代任何数组(尤其是多维),因此,*理论上*复杂度较低,例如你的解决方案。 – Shoe