2012-11-30 47 views
0

下面的代碼取自RubyTapas screencast,它向終端輸出一個Cowsays消息。該類有兩種方法,say以及接受url作爲參數的反引用方法。如果沒有反向方法,它不起作用,但我不明白何時/如何使用反向方法來打印出錯誤消息,因爲反向方法從不會被調用。它似乎(對我來說)你只需要撥打say方法,就像這樣Cowsays.new.say "Hello, StackOverflow"。你能解釋在這個代碼中如何調用反引號方法嗎?反撥操作符

______________________ 
< Hello, StackOverflow > 
---------------------- 
     \ ^__^ 
     \ (oo)\_______ 
      (__)\  )\/\ 
       ||----w | 
       ||  || 

代碼

require 'net/http' 
require 'cgi' 

class Cowsays 
    def `(url) 
    URI.parse(url) 
    end 

    def say(message) 
    message = CGI.escape(message) 
    Net::HTTP.get_print(`http://www.cowsays.com/cowsay?message=#{message}`) 
    end 
end 

Cowsays.new.say "Hello, StackOverflow" 
+2

它用在這裏:'get_print(\'HTTP://'所以'get_print'獲取'URI'對象作爲參數而不是字符串 – 2012-11-30 17:16:34

+3

哇,這是一個可怕的想法。 –

+0

@dominikh製作屏幕錄像的人只是向我們展示了一個技巧,明確表示這不是他的做法推薦。 – BrainLikeADullPencil

回答

1

這裏顯示的技巧是,您可以覆蓋反引號操作符。

所以,與其寫:

Net::HTTP.get_print(URI.parse("http://www.cowsays.com/cowsay?message=#{message}")) 

可以覆蓋反引號和使用

Net::HTTP.get_print(`http://www.cowsays.com/cowsay?message=#{message}`) 

代替。

正如已經在截屏中提到,這裏的評論 - 這只是一招,而且它不建議實際使用它:)

0

這應該是正規的報價一樣',而不是反引號。 Backtick用於執行shell命令並返回結果。

例如,要獲得文件的列表:

files = `ls` 

這顯然是通過對反引號方法Kernel通過它你可以,如果你想過程。我從來沒有見過這種做法,在生產應用程序中似乎是一個非常糟糕的主意。