在Ruby中打印最后一行

时间:2011-03-31 05:22:10

标签: ruby syntax global-variables

有没有办法让最后一个字符串的输出发送到输出?例如:

 puts "Hello"
 puts _+" World"

将返回

 Hello
 Hello World

我正在进行的任务涉及尽可能减少代码。上面的例子不是赋值,但如果存在这样的变量,它肯定会有所帮助。

由于

** 编辑 **

@gnibbler对我正在寻找的答案最接近。这与间距无关。我需要在前一行重用数据输出,而不是附加到它。另一个例子是:

 puts "foobar"   // foobar
 puts _.reverse  // raboof

4 个答案:

答案 0 :(得分:6)

是的可能。你需要覆盖像这样的Kernel :: puts方法

module Kernel
   alias_method :old_puts, :puts
   def puts arg
       old_puts arg
       $_=arg  # $_ is a global variable, holds the last printed item
   end
end

并像

一样使用它
>> puts "sample"
=> "sample"
>> _
=> "sample"
>> _.reverse
=> "elpmas"

_将始终保留最后打印的值

意味着

>> puts "hello" 
=> "hello"
>> puts _ + " word"
=> "hello word"
>> _
=> "hello word"

答案 1 :(得分:2)

没有特殊变量

除了修补看跌期权(这会与您最小化代码的要求相冲突),您可以使用这样的模式

puts w="Hello"
puts w=(w+" World")
puts w=(w.reverse)

答案 2 :(得分:1)

您是否有理由这样做?可能还有其他解决方案。如果你真的想这样做,你可以这样做:

module Kernel
  alias_method :puts_with_save, :puts
  def puts_with_save arg_
    puts arg_
    $LastPuts = arg_
  end
end

puts_with_save "hello" 
puts_with_save $LastPuts + " shanison"

这应该按预期工作。但是我向你的程序介绍了一个全球$ LastPuts。

答案 3 :(得分:0)

我唯一能想到的是,如果你知道你使用的是puts,你可以使用自己的版本修补它,以便为你的目标提供一个“记忆”。但是,在您的情况下,您可能会使用单独的机制而不是覆盖puts的默认行为。