2012-07-24 82 views
2

我正在做的事情ruby-lang.org紅寶石20分鐘教程,我碰到這個代碼就與IRB搞亂:奇怪的Ruby語法?

irb(main):015:0> def h(name) 
irb(main):016:1> puts "Hello #{name}!" 
irb(main):017:1> end 

基礎上解釋,#{name}部分只需添加變量到串?我認爲這是一個奇怪的和冗長的寫作方式,所以我只是想我會嘗試"Hello" + name,它的工作方式完全相同。

我搜索了一下,試圖找到#{}的含義,我找不到任何說話關於它,所以我想我會問社區..有什麼區別?有一個嗎?

在此先感謝!

+2

http://symbolhound.com/?q=%23%7B%7D – 2012-07-24 22:22:44

回答

5

有時使用+比較容易,但在這種情況下,您可以省略感嘆號。試想一下:

puts "Hello #{name}!" 

puts "Hello " + name + "!" 

我找到的第一個更具可讀性,在字符串中多次使用時尤其如此。

還要考慮是多麼容易在第二版的「你好」後,離開了空間:

puts "Hello" + name + "!" 

很容易寫,但可能不是你的意思。

最後,它使一個更大的差異,當你正在插值不是字符串:

puts "The Winner was #{name} with a score of #{score}!" 

順便提一下,搜索「字符串插值」可能會更容易找東西比只是搜索語法。

+2

保羅爲我們騎這架霰彈槍! ;) – 2012-07-24 21:58:21

+1

@ Maximus9000當你插入的內容只是一個字符串,那麼是的,我會說這只是語法偏好的問題,但它適用於各種Ruby值,這使得它不僅僅是首選項。我用這個例子更新了我的答案。 – 2012-07-24 22:04:44

+0

字符串插值通常也更快。我無法想象太多情況下速度真的很重要,但只是另一個避免添加醜陋字符串的原因。 – Max 2012-07-25 03:14:52

4
"Hello #{name}!" 
"Hello " + name + "!" 

String interpolation幾乎總是易於閱讀,特別是如果有多個值插補。

如果進行插值值它可能變得困難是冗長:

"Attendees: #{names.collect(&:first_name).join(', ')}" 

在這樣的情況下,你可能會想連接,或者只使用一個臨時變量。

2

重要的是要注意它不僅僅是可讀性。使用字符串插值可以做正確的事情,例如呼籲to_s無論是#{}

之間

1.9.3p194 :001 > "as" + 23 
    TypeError: can't convert Fixnum into String 
    from (irb):1:in `+' 
    from (irb):1 
    from /Users/paul/.rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in `<main>' 
與之相對

1.9.3p194 :002 > "as #{23}" 
=> "as 23" 
1

的#{}用於string interpolation,它可以讓您輕鬆並明確提出數據在你的字符串。 Ruby評估大括號內的內容,然後調用其每個Ruby對象從Object繼承的方法。

這允許您甚至可以在字符串中進行計算,例如,

"5 + 7 = #{5 + 7}" 
=> "5 + 7 = 12" 
2

最大的區別在於讀數方便,符合習慣用法和速度。

使用"Hello " + name + "!"時,您(以及Ruby解釋器)共創建3個附加字符串,而不是​​,它只創建一個附加字符串。

請記住,使用字符串插值("#{}")會自動調用#to_s,這可能需要也可能不需要。

查看this SO question瞭解更多信息。