Question

I have the following code:

module A
  def self.included(base)
    base.extend(ClassMethods)
  end
  def foo
    a = bar
    puts a
  end
  def bar(str="qwe")
    str
  end

  module ClassMethods
  end
end

class B
  include A
  def bar(str="rty")
    str
  end
end

B.new.foo #=> "rty"

I wish class B to look like this:

class B
  include A
  bar "rty"
end

B.new.foo #=> rty

or

class B
  include A
  HelperOptions.bar "rty"  # HelperOptions class should be in module A
end

B.new.foo #=> rty

I tried using define_method, class_eval, and initialize. How can be implemented syntax bar 'rty' or HelperOptions.bar 'rty' and what shall be done in module A?

Was it helpful?

Solution

If I got your question properly you want to define a class method A.bar that defines an instance method B#bar that returns it's argument, you can do it like this:

module A
  def self.included(base)
    base.extend(ClassMethods)
  end
  def foo
   puts bar
  end

  module ClassMethods
    def bar(str)
      define_method(:bar) { str }
    end
  end
end

class B
  include A
  bar 'rty'
end

B.new.bar
# => "rty"

B.new.foo
# Output: rty
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top