反击操作符

时间:2012-11-30 17:13:23

标签: ruby

以下代码取自RubyTapas截屏视频,向终端打印出Cowsays消息。该类有两个方法say,还有一个反引号方法,它接受url作为参数。没有反引号方法它不起作用,但我不明白何时/如何使用反引号方法打印出cowsays消息,因为从不调用反引号方法。看来(对我而言)您只需要调用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 个答案:

答案 0 :(得分: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}`)

代替。

正如截屏视频和评论中所提到的 - 这只是一个技巧,并不建议实际使用它:)

答案 1 :(得分:0)

这应该是'之类的常规引号而不是反引号。 Backtick用于执行shell命令并返回结果。

例如,要获取文件列表:

files = `ls`

这显然是传递给Kernel中的反引号方法,如果你愿意,你可以覆盖它。我以前从未见过这样做,在生产应用程序中看起来是一个非常糟糕的主意。