有我的代码使用SimpleDelegator
require 'delegate'
class Foo < SimpleDelegator
def meth
p 'new_meth'
end
end
class Bar
def meth
p 'old_meth'
end
def bar_meth
meth
end
end
bar = Bar.new
foo = Foo.new(bar)
foo.meth #=> "new_meth"
foo.bar_meth #=> "old_meth"
Run Code Online (Sandbox Code Playgroud)
为什么最后一行给出"old_meth"???!!!谢谢!
我有一个代码:
class A
attr_accessor :somevar
def a
somevar = 'something'
puts @somevar
end
def b
send :somevar=, 'something'
puts @somevar
end
end
A.new.a #=> nil
A.new.b #=> 'something'
Run Code Online (Sandbox Code Playgroud)
为什么会有区别?为什么我不能通过编写器分配实例变量?但是为什么已经调用了局部变量而不是方法(setter)呢?
我想找到一个gem或者编写一个实现方法钩子的代码.
class A
include SomeModule
before_hook :meth, lambda { puts 'bla' }
def meth
puts 'meth'
end
end
# A.new.meth => "bla\nmeth\n"
Run Code Online (Sandbox Code Playgroud)
我正在使用Rails,但我知道回调和过滤器
meth 不是一个动作请帮帮我...
UPDATE
我发现了一个用于自动化此代码的gem:
include ActiveSupport::Callbacks
define_callbacks :meth_callback
set_callback :meth_callback, :before do |object|
# my code
end
def meth_with_callback
run_callbacks(:meth_callback) { meth }
end
alias_method_chain :meth, :callback
Run Code Online (Sandbox Code Playgroud)