0

有没有办法以像这样可执行的方式将块嵌入字符串中?

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

3 回答 3

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)

还要注意 double equal ==,它是 Ruby 中的相等运算符。Single equal=是赋值运算符,在您的代码中,它会在每个循环中重置ito的值。1

因为除了 nil 和 false 之外的所有值在 Ruby 中都是真实的,所以您提出的 if .. then 将始终为真,因为i=1返回1,这是真的。

于 2013-01-07T02:00:53.473 回答
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
于 2013-01-07T11:38:16.090 回答
1

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

for i in 1..1000
  puts "There once was #{i == 1 ? 'a man' : 'many men'} from kilkenny"
end
于 2013-01-07T02:01:08.277 回答