2013-01-07 73 views
0

有什麼方法可以像這樣以可執行的方式在塊內嵌入塊嗎?在字符串中嵌入塊

for i in 1..1000 
    test "There once was #{if i=1{'a man'} else {'many men'} end} from kilkenny" 
end 
+1

'如果我= 1'不是測試'i'是否等於'1'的好方法。 –

+3

在代碼審查中,我認爲在字符串中嵌入'#{...}'邏輯是一種不好的做法。這是意想不到的,邏輯應該在字符串之前執行,分配給變量,並將變量插入到字符串中。它會更乾淨,更清晰,更易於維護。 –

+0

是的i = 1是不正確的,從許多年前的許多年前和另一種語言的舊習慣... – Gary

回答

3

是的,#{}內一切都將使用該字符串前評估,因此必須是有效的Ruby代碼。嘗試:

1.upto(1000) do |i| 
    puts "There once was #{i==1?"a man":"many men"} from kilkenny" 
end 

在這裏,我已經使用了三元運算符,在Ruby和其他語言的使用,這基本上是:

(boolean condition) ? (return this on true) : (return this on false) 

還要注意兩個等於==,這是平等的運營商紅寶石。單等於,=是賦值運算符,它在您的代碼中將每個循環中的值i重置爲1

由於除零和假以外的所有值都是Ruby中的truthy,所以如果.. then將始終爲真,因爲i=1返回1,這是正確的。

+0

不錯,謝謝。我在初始循環中遇到問題。 – Gary

+2

如果你不介意拋出'then',你也可以使用'if':'「...#{{if i == 1 then'a man'else'many men'end} .. 「'。 –

+0

是的,只是想我會拋出一些新東西 – quandrum

1

您可以使用Ruby的三元運算符:

for i in 1..1000 
    puts "There once was #{i == 1 ? 'a man' : 'many men'} from kilkenny" 
end 
+0

好吧,除了在前面的測試部分。應該把... – Gary

+0

肯定,更新 - 但沒有意識到這是問題的一部分。 – Peter

1

你已經獲得與三元運算符的答案。

也許另一個版本的%-method爲您提供了一個更好的概述。 三個fdifferent版本的例子:

1.upto(10) do |i| 
    puts "There once was %s from kilkenny" % (i==1 ? "a man" : "many men") 
    puts "There once was %s from kilkenny" % if i==1; "a man"; else "many men"; end 
    puts "There once was %s from kilkenny" % case i 
     when 1; "a man" 
     else "many men" 
     end  
end 

而且你還可以使用散列您的問題:

man = Hash.new("many men") 
man[1] = "a man" 
man[2] = "two men" 
1.upto(10) do |i| 
    puts "There once was #{man[i]} from kilkenny" 
end 

end 

或用哈希創造的另一個版本:

man = Hash.new(){|h, key| 
    h[key] =case key 
    when 1 
     "a man" 
    when 2 
     "two men" 
    else 
     "many men" 
    end 
} 
1.upto(10) do |i| 
    puts "There once was #{man[i]} from kilkenny" 
end