سؤال

I've been looking around the web and have found a great deal of information on attempting what I am, however one bit of sugar I'd like to add to my Ruby/Rails mixin, is creating a function that looks for a pattern. I want to create a base function called

is_a_*

where * can be anything. Whatever that * is, needs to be retrievable so I can use it inside the function and act accordingly. Do I have to use method_missing?

هل كانت مفيدة؟

المحلول

This is what method_missing was made for, e.g. something like this should work:

module MyMixin

  def respond_to?(method, priv=false)
    (method.to_s =~ /^is_a_(\w+)$/) || super
  end

  def method_missing(sym, *args)
    if sym.to_s =~ /^is_a_(\w+)$/
      pattern = $1
      # then just do something with pattern here, e.g.:
      puts pattern
    else
      super
    end
  end

end

Then just include MyMixin in your class, e.g.:

class A
  include MyMixin
end

a = A.new
a.is_a_foo
#=> "foo"

p.s. you don't strictly need to override respond_to?, I just included it for completeness:

a.respond_to?("is_a_foo")
#=> true
a.respond_to?("is_a_bar")
#=> true
a.respond_to?("is__a_foo")
#=> false
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top