一个更优雅的方式来做到这一点?

时间:2014-07-25 02:18:56

标签: ruby methods scope

很抱歉,我没有明确表达自己的标题,但老实说,我无法解决如何更好地表达我的问题;如果有人能想到更好的头衔,请一定要改变它。

看看下面的例子:

module Foo
  def method(value)
    Bar.instance_exec(self.method(value))
  end

  class Bar

    def self.method(value)
      print value
    end

  end
end

这是唯一的方法,Bar的{​​{1}} method可在Foo的命名空间内使用,而无需调用Bar或是否有更多优雅的方式来做到这一点?也许method_missing可能会有效,但有点麻烦。

编辑: 进一步的例子

Module Foo
  class SomeClassController < ApplicationController

   def index
    method(@user.id) #instead of Bar.method(@user.id)
  end

end

我正在构建一个引擎,但我不希望每次我想使用一个应该在该主名称空间中的任何地方都可用的方法时引用Engine Foo在这个例子中)AS更像是实用方法,但它们需要在Engine的范围内完成。

编辑: 结果我没有正确使用代码

module Foo
  def method(value)
    return Bar.instance_exec(value) { |v| return self.method(value)}
  end

  class Bar

    def self.method(value)
      return (value + 59)
    end

  end
end

instance_exec块内的方法会返回到它之外,以便def method中的module Foo返回正确的值。

编辑:我意识到这有点模糊,但是当我说instance_exec正是我正在搜索的内容时,请相信我,并且instance_exec在契约的执行块之外返回。

1 个答案:

答案 0 :(得分:0)

我的问题的答案如下,使用rails引擎作为示例来添加更易理解的上下文

engine.rb:

module Foo

 class Engine

    class SomeClass

      def method(value)
        return (value + 59)
      end

    end
  end
end

otherActions.rb

module Foo

  def method(value)
    return Engine.instance_exec(value){ |v|  return self::SomeClass.method(v) }
  end

end

Engine_Controller.rb

Module Foo

  class EngineController < ApplicationController.rb

    def index
      @user.some_field = method(params[:user_input])
    end

  end
end

我认为这应该运作良好,我知道所有事情至少在method def index范围内使用,我不确定,但问题的主要内容是在其他行动中回答.rb