1

以下のコードは、RubyTapas スクリーンキャストから取得したもので、Cowsays メッセージを端末に出力します。このクラスには 2 つのメソッドがsayあり、URL をパラメーターとして受け入れる backtick メソッドもあります。バックティックメソッドなしでは機能しませんが、バックティックメソッドが呼び出されることはないため、カウセイメッセージを出力するためにバックティックメソッドがいつ/どのように使用されるかわかりません。sayso のようにメソッドを呼び出すだけでよいように (私には) 見えますCowsays.new.say "Hello, StackOverflow"。このコードで backtick メソッドがどのように呼び出されるか説明できますか?

 ______________________
< 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

これは、バッククォートではなく、通常の引用符である必要が'あります。バックティックは、シェル コマンドの実行に使用され、結果を返します。

たとえば、ファイルのリストを取得するには:

files = `ls`

これは明らかに、必要に応じてオーバーライドできるバックティック メソッドに渡されKernelます。これが行われたのを見たことがなく、本番アプリケーションで行うのは非常に悪い考えのようです。

于 2012-11-30T17:30:51.543 に答える