gpt4 book ai didi

ruby - Ruby 的方法解除绑定(bind)机制有什么意义?

转载 作者:数据小太阳 更新时间:2023-10-29 06:54:57 25 4
gpt4 key购买 nike

Method#unbind返回对该方法的 UnboundMethod 引用,稍后可以使用 UnboundMethod#bind 将其绑定(bind)到另一个对象.

class Foo
attr_reader :baz

def initialize(baz)
@baz = baz
end
end

class Bar
def initialize(baz)
@baz = baz
end
end

f = Foo.new(:test1)
g = Foo.new(:test2)
h = Bar.new(:test3)
f.method(:baz).unbind.bind(g).call # => :test2
f.method(:baz).unbind.bind(h).call # => TypeError: bind argument must be an instance of Foo

最初,我认为这非常棒,因为我希望它的工作方式类似于 JavaScript 的 Function.prototype.call()/Function.prototype.apply() .但是,您要绑定(bind)该方法的对象必须属于同一类

我能想到的唯一应用是如果你解除绑定(bind)一个方法,失去原来的实现(重新定义原始或单例类中的方法)然后重新绑定(bind)并调用它。

最佳答案

我将总结到目前为止发现的良好用途。不过,两者都不使用 unbind


首先,覆盖一个方法,使用旧的实现。 Source ,感谢@WandMaker。

假设你想做这样的事情:

class Foo
alias old_bar bar

def bar
old_bar
some_additional_processing
end
end

这会起作用,但会留下 old_bar,这是不可取的。相反,可以这样做:

class Foo
old_bar = instance_method(:bar)

define_method(:bar) do
old_bar.bind(self).call
some_additional_processing
end
end

其次,调用层次结构中方法的另一个实现。 Source .

帖子中给出的一个非常实际的例子是,在调试过程中,你经常想找到定义方法的位置。一般来说,您可以通过以下方式做到这一点:

method(:foo).source_location

但是,如果当前实例实现了一个method 方法,这将不起作用,就像ActionDispatch::Request 的情况一样。 .在这种情况下,您可以这样做:

Kernel.instance_method(:method).bind(self).call(:foo).source_location

关于ruby - Ruby 的方法解除绑定(bind)机制有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33708250/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com