在字符串中嵌入块

时间:2013-01-07 01:54:05

标签: ruby string embed

有没有办法以一种可执行的方式在一个字符串中嵌入一个块?

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

3 个答案:

答案 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