1

下面的代码取自 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"
4

2 回答 2

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}`)

反而。

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

于 2012-11-30T19:00:24.187 回答
0

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

例如,要获取文件列表:

files = `ls`

这显然被传递给反引号方法,Kernel如果需要,您可以在其中覆盖。我以前从未见过这样做,并且在生产应用程序中这样做似乎是一个非常糟糕的主意。

于 2012-11-30T17:30:51.543 回答