Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby单行惰性字符串求值_Ruby - Fatal编程技术网

Ruby单行惰性字符串求值

Ruby单行惰性字符串求值,ruby,Ruby,我想创建ruby one liner,它将一些信息打印到stdout并从stdin获取数据。我有一些代码: ["This should be shown first", "This second: #{gets.chomp}"].each{|i| puts "#{i}"} …但显然,get.chomp是在整个数组求值的同时求值的,在每个元素迭代之前 结果,首先提示输入,然后打印每个元素 我是否可以懒洋洋地对它求值,按顺序打印数组,并且仍然将整个内容放在一行中?实现懒洋洋求值的一种方法是使用pr

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

["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