0

私はRubyを勉強してmethod_missingいて、実装しようとしていますが、機能していません。たとえば、後にメソッド名を出力したいのですfind_が、Bookインスタンスで呼び出すと、rubyは「undefinedmethod'find_hello'」を発生させます。

TEST_05.RB

module Searchable
    def self.method_missing(m, *args)
        method = m.to_s
        if method.start_with?("find_")
            attr = method[5..-1]
            puts attr
        else
            super
        end
    end
end

class Book

    include Searchable

    BOOKS = []
    attr_accessor :author, :title, :year

    def initialize(name = "Undefined", author = "Undefined", year = 1970)
        @name = name
        @author = author
        @year = year
    end
end


book = Book.new
book.find_hello
4

2 に答える 2

3

objectメソッドを探すメソッドを呼び出していますinstance_levelmethod_missingしたがって、instance_levelメソッドを定義する必要があります。

module Searchable
    def method_missing(m, *args)
        method = m.to_s
        if method.start_with?("find_")
            attr = method[5..-1]
            puts attr
        else
            super
        end
    end
end

class Book

    include Searchable

    BOOKS = []
    attr_accessor :author, :title, :year

    def initialize(name = "Undefined", author = "Undefined", year = 1970)
        @name = name
        @author = author
        @year = year
    end
end


book = Book.new
book.find_hello   #=> hello

selfメソッド定義で使用する場合。class levelメソッドとして定義されています。あなたの場合Book.find_helloはを出力しますhello

于 2013-03-24T06:25:15.540 に答える
2

でクラスメソッドmethod_missingとして定義しましたが、インスタンスメソッドとして呼び出そうとしています。メソッドをそのまま呼び出すには、クラスに対して実行します。Searchable

Book.find_hello

あなたの意図が本のコレクション全体から何かを見つけることであるならば、これはそれが行われる標準的な方法です。ActiveRecordはこのアプローチを使用します。

同様にfind_*、現在の本のインスタンスで何かを検索するインスタンスメソッドを持つことができます。それがあなたの意図である場合は、に変更def self.method_missingしてくださいdef method_missing

于 2013-03-24T06:27:50.517 に答える