Ruby一线内胆懒人串评价

时间:2016-02-19 17:39:23

标签: ruby

我想创建ruby one liner,将一些信息输出到stdout并从stdin获取数据。我有一些代码:

["This should be shown first", "This second: #{gets.chomp}"].each{|i| puts "#{i}"}

...但显然,在每个元素的迭代之前,在评估整个数组的同时评估get.chomp。

结果,我首先提示输入,然后打印每个元素。

我可以以某种方式懒惰地评估它,按顺序打印数组并且仍然将整个事物放在一行中吗?

4 个答案:

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