2017-01-20 12 views
1
class Tests 
    def self.test1 
    'This is the First' 
    end 

    def self.test2 
    'This is the second' 
    end 
end 
puts Tests.test1.test2 

私はエラーにそれを2回呼び出すRubyクラスのメソッド?

undefined method `test2' for "This is the First":String (NoMethodError). 

を得続ける私は2番目のクラスのメソッドを呼び出すために、そのことはできませんを想定しています。しかし私はそれが可能であることを私に伝える何かをコーディングしています。誰でもこれを確認したり解決したりできますか?あなたは、各メソッドからselfを返す場合

+0

これは "流暢なインターフェイス"と呼ばれるので、これは私の答えに普及した歴史的な文脈にリンクしたブログ記事へのリンクです。 – akuhn

答えて

2

、あなたは彼らに無限の回数をチェーンすることができます:)

:それ以外の方法はどうしたらすべてがselfを返しているので、私は、各メソッドにputsを追加しました。

class Tests 
    def self.test1 
    puts 'This is the First' 
    self 
    end 

    def self.test2 
    puts 'This is the second' 
    self 
    end 
end 

Tests.test1.test2 
#=> This is the First 
#=> This is the second 

基本的には、この方法では、いくつかのロジックを実行し、それが終了したとき、各チェーンメソッド呼び出しがオブジェクトに呼び出されるように、何があったとき、あなたは(ない従来の方法の結果に、オブジェクト自体を返しませんselfが返されます)。

+2

ありがとうございました。最後に自己を置くことで、実際には私が望んでいたチェーンメソッドを呼び出すことができました。 – Hayasama

+0

@Hayasamaは、各メソッドに 'puts'を追加しました。そうしないと、すべてのメソッドが' self'を返すためです。喜んで、それが働いてから答えを受け入れることを確認してください(回答スコアの下のチェックマークを探してください) –

1

これらの定義では使用できません。あなたはTestsクラスに2つのクラスメソッドを定義しています。これはあなたのコードと同等です:

string = Tests.test1 
# => string = "This is the First" 
string.test2 
# => (undefined method) 

test2Stringクラスで定義されていないので、あなたがundefined method 'test2' for (...):Stringエラーが発生します。

-1

ここでメソッド呼び出しを連鎖したい理由がわからない場合は、それらを別々に呼び出すことができます。エラーの

Tests.test1 
=> "This is the First" 

Tests.test2 
=> "This is the second" 

短い説明、いかなる方法この」の

エラー未定義のメソッド `TEST2' に結果その下に定義TEST2を有していない文字列を返す第一の方法TEST1まずです」:あなたが構築しようとしているような文字列(NoMethodError)

2

が見える 『流れるようなインターフェイス』

基本的な考え方は、オブジェクトのすべてのメソッドがselfを返すときに、受信者を繰り返さずに連鎖させることができるということです。このアイデアは、このブログの記事でMartin Flowerによって広く普及していますが、Smalltalkの;メソッド連鎖構文にまでさかのぼります。

これは実際にはクラスメソッドとは無関係であるとインスタンスメソッドのためのちょうど同じように動作します。ここでは、クラスからインスタンス側にチェーンを渡す例です

class Lorem 
    def self.ipsum 
    Lorem.new # passing the change from class to instance side 
    end 
    def dolor 
    self 
    end 
    def sit 
    self 
    end 
    def amet 
    self 
    end 
end 

Lorem.ipsum.dolor.sit.amet 
+0

それは '流暢なインターフェイス'、+1と呼ばれていたのか分かりませんでした。 P.S. Rubyに 'クラスメソッド'はありません。私はあなたが知っていると確信しています - それはすべてのインスタンスメソッドです:) –

+0

@andreydeineko haha​​ha! – akuhn

+0

Smalltalkのメソッドカスケード( ';')は 'Lorem.ipsum.tap(&:dolor).tap(&:sit).tap(&:amet)'のようなものです - 受信者を返すメソッドを必要としません。 – Stefan

関連する問題