Ruby单行惰性字符串求值
我想创建ruby one liner,它将一些信息打印到stdout并从stdin获取数据。我有一些代码:Ruby单行惰性字符串求值,ruby,Ruby,我想创建ruby one liner,它将一些信息打印到stdout并从stdin获取数据。我有一些代码: ["This should be shown first", "This second: #{gets.chomp}"].each{|i| puts "#{i}"} …但显然,get.chomp是在整个数组求值的同时求值的,在每个元素迭代之前 结果,首先提示输入,然后打印每个元素 我是否可以懒洋洋地对它求值,按顺序打印数组,并且仍然将整个内容放在一行中?实现懒洋洋求值的一种方法是使用pr
["This should be shown first", "This second: #{gets.chomp}"].each{|i| puts "#{i}"}
…但显然,get.chomp是在整个数组求值的同时求值的,在每个元素迭代之前
结果,首先提示输入,然后打印每个元素
我是否可以懒洋洋地对它求值,按顺序打印数组,并且仍然将整个内容放在一行中?实现懒洋洋求值的一种方法是使用procs。类似这样的内容(多行以便于阅读):
我真的不认为这是一行,因为它变得非常不可读的优势,但尽管如此:
[ ->{ "This should be shown first" },
->{ "This second: #{gets.chomp}" }
].each {|line| puts line.call }
请注意,永远不要做
“{foo}”
。当您想要插入字符串时,请使用字符串插入({…}
),如上面第二行所示。如果要将非字符串转换为字符串,请执行foo.to\s
。如果你知道它已经是一个字符串(或者不在乎它是否是),直接使用它:foo
。但是,put
会自动调用它的参数上的到_s
,所以只要做put foo
,如果你不介意重复put:
['puts "This should be shown first"', 'puts "This second: #{gets.chomp}"'].each{|i| eval i}
这只是为了说明您可以使用方法而不是过程
def line2
"#{["cat","dog"].sample}"
end
["Line 1", :line2, "line 3"].each { |l| puts (l.is_a? Symbol) ? method(l).call : l }
#=> dog
这将在打印第二行之前请求输入。不确定这是否是需要的行为。请交叉手指,希望您的用户不要输入
”;`rm-rf/`
,我同意,使用eval时应小心。在这种情况下,我认为这很好。首先:运行此操作的用户可能已经具有shell访问权限(OP不清楚上下文).Second:注入不是那样工作的。我猜,字符串插值通过转义'''@dabai:为什么不在你的机器上试试?:)来禁止求值我确实尝试过使用''.''rm foo''.'更一般地说,当您想要延迟执行时,请考虑“proc”…或“method”:-)(见下文)
def line2
"#{["cat","dog"].sample}"
end
["Line 1", :line2, "line 3"].each { |l| puts (l.is_a? Symbol) ? method(l).call : l }
#=> dog