有没有办法以像这样可执行的方式将块嵌入字符串中?
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)
还要注意 double equal ==
,它是 Ruby 中的相等运算符。Single equal=
是赋值运算符,在您的代码中,它会在每个循环中重置i
to的值。1
因为除了 nil 和 false 之外的所有值在 Ruby 中都是真实的,所以您提出的 if .. then 将始终为真,因为i=1
返回1
,这是真的。
你已经得到了三元运算符的答案。
也许使用 %-method 的另一个版本可以为您提供更好的概览。三个不同版本的示例:
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
您可以使用 Ruby 的三元运算符:
for i in 1..1000
puts "There once was #{i == 1 ? 'a man' : 'many men'} from kilkenny"
end