有没有办法以一种可执行的方式在一个字符串中嵌入一个块?
for i in 1..1000
test "There once was #{if i=1{'a man'} else {'many men'} end} from kilkenny"
end
答案 0 :(得分: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)
另请注意双等于==
,它是Ruby中的相等运算符。单个相等,=
是赋值运算符,在您的代码中,它会在每个循环中将i
的值重置为1
。
因为除了nil和false之外的所有值在Ruby中都是真实的,所以你提出的if ..然后将永远为真,因为i=1
返回1
,这是真的。
答案 1 :(得分:1)
您可以使用Ruby的三元运算符:
for i in 1..1000
puts "There once was #{i == 1 ? 'a man' : 'many men'} from kilkenny"
end
答案 2 :(得分: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
或者使用其他版本的Hash创建:
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