有什麼方法可以像這樣以可執行的方式在塊內嵌入塊嗎?在字符串中嵌入塊
for i in 1..1000
test "There once was #{if i=1{'a man'} else {'many men'} end} from kilkenny"
end
有什麼方法可以像這樣以可執行的方式在塊內嵌入塊嗎?在字符串中嵌入塊
for i in 1..1000
test "There once was #{if i=1{'a man'} else {'many men'} end} from kilkenny"
end
是的,#{}
內一切都將使用該字符串前評估,因此必須是有效的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
,這是正確的。
你已經獲得與三元運算符的答案。
也許另一個版本的%-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
'如果我= 1'不是測試'i'是否等於'1'的好方法。 –
在代碼審查中,我認爲在字符串中嵌入'#{...}'邏輯是一種不好的做法。這是意想不到的,邏輯應該在字符串之前執行,分配給變量,並將變量插入到字符串中。它會更乾淨,更清晰,更易於維護。 –
是的i = 1是不正確的,從許多年前的許多年前和另一種語言的舊習慣... – Gary