2011-03-31 66 views
1

有沒有什麼辦法讓最後一個字符串的輸出發送到輸出?例如:獲取在Ruby中打印的最後一行

puts "Hello" 
puts _+" World" 

將返回

Hello 
Hello World 

我工作的轉讓涉及減少代碼儘可能。上面的例子不是賦值,但是如果存在這樣的變量,它肯定會有所幫助。

感謝

** 編輯 **

@gnibbler具有最接近的答案就是我要找的。這與間距無關。我需要重用前一行的數據輸出,而不是附加到它。另一個例子是:

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

這個問題實際上與換行無關,我需要重複使用前一行的數據,而不是附加到它。 – Workman 2011-03-31 05:44:47

+0

爲什麼你不能只保留在你自己的變量,然後呢? – sawa 2011-03-31 05:49:00

+0

我可以,但這是代碼縮小分配。我試圖找到方法將我的代碼縮短到產生所需輸出所需的絕對最小值。 – Workman 2011-03-31 05:53:19

回答

6

是的,它是可能的。你需要重寫內核::看跌期權方法喜歡這個

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

我能想到的唯一的事情是,如果你知道你使用puts,你可以用自己的版本,修補它,給它一個「記憶」,以滿足您的目標。然而,聽起來就像你的情況,你可能會使用一個單獨的機制,而不是覆蓋默認行爲puts

2

有針對

除了修補看跌期權(將與你的要求相沖突,以儘量減少代碼)沒有特別的變量,你可以使用像

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

這等模式

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。

+0

有,但我仍然試圖自己找到最好的解決方案之前,我陷入困境,並尋求幫助。這就是爲什麼我只是要求提供參考信息,而不是簡單地發佈問題。謝謝 – Workman 2011-03-31 05:50:30

+1

我已經更新了我的答案。希望能幫助到你 – Shanison 2011-03-31 06:02:01