2013-07-23 143 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