很抱歉,我没有明确表达自己的标题,但老实说,我无法解决如何更好地表达我的问题;如果有人能想到更好的头衔,请一定要改变它。
看看下面的例子:
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
在契约的执行块之外返回。
答案 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