我想创建ruby one liner,将一些信息输出到stdout并从stdin获取数据。我有一些代码:
["This should be shown first", "This second: #{gets.chomp}"].each{|i| puts "#{i}"}
...但显然,在每个元素的迭代之前,在评估整个数组的同时评估get.chomp。
结果,我首先提示输入,然后打印每个元素。
我可以以某种方式懒惰地评估它,按顺序打印数组并且仍然将整个事物放在一行中吗?
答案 0 :(得分:5)
实现延迟评估的一种方法是使用过程。像这样的东西(可读性的多行):
[
-> { puts "This should be shown first" },
-> { print "This second: "; puts gets.chomp },
].each(&:call)
答案 1 :(得分:2)
我真的没有看到将它作为单线程的优势,因为它变得非常难以理解,但仍然是:
[ ->{ "This should be shown first" },
->{ "This second: #{gets.chomp}" }
].each {|line| puts line.call }
P.S。永远不要"#{foo}"
。如果您想要插入字符串,请使用字符串插值(#{...}
),如上面的第二行所示。如果要将非字符串转换为字符串,请执行foo.to_s
。如果你知道它已经是一个字符串(或者不关心它),只需直接使用它:foo
。但是puts
会自动调用to_s
的参数,所以只需puts foo
。
答案 2 :(得分:0)
如果你不介意重复投注:
['puts "This should be shown first"', 'puts "This second: #{gets.chomp}"'].each{|i| eval i}
答案 3 :(得分:0)
这只是为了表明你可以使用方法而不是proc。
export CGO_CPPFLAGS="-I $BREW_HOME/include"
export CGO_LDFLAGS="-L $BREW_HOME/lib"