2017-04-21 7 views
1

次のコードでは、以下のエラーが発生します。モジュールをインクルードしても、まだメソッドを呼び出すことができません

require 'open3' 

module Hosts 
    def read 
    include Open3 
    popen3("cat /etc/hosts") do |i,o,e,w| 
     puts o.read 
    end 
    end 
end 

Hosts.read 
#=> undefined method `popen3' for Hosts:Class (NoMethodError) 

私はOpen3::popen3すなわち完全なパスを使用してpopen3を呼び出す場合、それは動作します。しかし、私はinclude - それを持っていたので、私はOpen3::ビットが必要ではないと思った?

おかげ

答えて

0

あなたは、インスタンスメソッドを定義していますが、シングルトンメソッドとしてそれを使用しようとしています。

module Hosts 
    extend Open3 

    def read 
    popen3("cat /etc/hosts") do |i,o,e,w| 
     puts o.read 
    end 
    end 
    module_function :read # makes it available for Hosts 
end 

今:

Hosts.read 
## 
# Host Database 
# 
# localhost is used to configure the loopback interface 
# when the system is booting. Do not change this entry. 
## 
127.0.0.1 localhost 
255.255.255.255 broadcasthost 
::1    localhost 
=> nil 

あなたのためのより明確なものを作るだろうRubyで次の概念について読む:あなたが可能に欲しいものにするために、あなたもextendOpen3、ないincludeに持って

  • コンテキスト

  • self

  • includeextend

代わりのmodule_fuctionあなたは、以下のいずれかで同じ結果を得ることができます:

module Hosts 
    extend Open3 
    extend self 

    def read 
    popen3("cat /etc/hosts") do |i,o,e,w| 
     puts o.read 
    end 
    end 
end 

そして

module Hosts 
    extend Open3 

    def self.read 
    popen3("cat /etc/hosts") do |i,o,e,w| 
     puts o.read 
    end 
    end 
end 
+0

ああ、私アロンを考えていたそれらの行は短いです。私は '延長'を読み上げるでしょう。そして、 'module_function'!どうもありがとう。 – spoovy

+0

@spoovy N/p :)また、いくつかのオプションで同じ効果を達成することもできます。ちょっと編集します(興味がある場合に備えて:)) –

関連する問題