Ruby ruby unbind 方法的使用场景

easyhappy · 2013年06月25日 · 最后由 meeasyhappy 回复于 2016年03月31日 · 4158 次阅读

class Test def initialize(value) @x = value end

def my_method @x end end test = Test.new(1) m = test.method :my_method puts "test.my_method is #{m.call}"

unbind = m.unbind test_2 = Test.new(2) m = unbind.bind(test_2) puts "-"*30 puts "test_2.my_method is #{m.call}"

** 这里我有一个疑问 **

bind 和 unbind 使用场景是什么?

详见 sinatra 源码

#1 楼 @jjym 我觉得 Sinatra 那种做法纯粹蛋疼。。没有足够证据表明这种做法确实效率高啊。。事实上只在部分 Ruby 实现中效率略高一些。。

#3 楼 @iBachue 我觉得应该主要为了支持那种语法吧,不是因为效率

其实 如果为了 支持这种语法 而这么做的话,有点疼了....

希望 哪位 能够给出一个 比较的 使用 bind 和 unbind 的场景...

#3 楼 @iBachue #4 楼 @jjym #5 楼 @meeasyhappy

Sinatra 用这个是为了 call 的时候绑定当前 app 对象的上下文啊。跟效率和支持语法都没关系吧。他每一次 request 都会 dup 一个 app。

@luikore @Saito

#6 楼 @zgm 用 block 的话 self 也有问题,所以说是为了支持 sinatra 语法的

#5 楼 @meeasyhappy 幸亏你问得不是 fiber...

#7 楼 @jjym 没太懂,用block的话self也有问题,也没看懂 支持 Sinatra 语法是什么意思

#8 楼 @zgm 就是 block 的语法啊,但是直接用 proc 的话 self 搞不定

#9 楼 @jjym block 的用法是为了 Sinatra 的 DSL 特性,这个很多软件都这么写。

但是 sinatra 内部又把这个 block 实际上转换成一个 unbound_method, 然后每次请求 绑定在 当前的 app 上面。

所以我说是为了利用上下文。不是性能。而支持 DSL 语法是 block 做的,与 unbound_method 关系不大。

# https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L869

# Rack call interface.
def call(env)
  dup.call!(env)
end
# https://github.com/sinatra/sinatra/blob/master/lib/sinatra/base.rb#L974

def process_route(pattern, keys, conditions, block = nil, values = [])
  route = @request.path_info
  route = '/' if route.empty? and not settings.empty_path_info?
  return unless match = pattern.match(route)
  values += match.captures.to_a.map { |v| force_encoding URI.unescape(v) if v }

  if values.any?
    original, @params = params, params.merge('splat' => [], 'captures' => values)         keys.zip(values) { |k,v| Array === @params[k] ? @params[k] << v : @params[k] = v if v }
  end

  catch(:pass) do
    conditions.each { |c| throw :pass if c.bind(self).call == false }
    block ? block[self, values] : yield(self, values)
  end
ensure
  @params = original if original
end

如果不用这个方式,这里该怎么处理?

#9 楼 @jjym 你说说 filber 的场景呗。我知道你知道这个。我了解的好像只有 Enumerable 的 next 用了 filber,不太清楚其他的。

#10 楼 @zgm 为什么不用,这样处理不是挺好么

#12 楼 @jjym 我的观点就是 用。。。

#11 楼 @zgm 我只是讽刺下 lz..不要听我乱吹牛啊。。

@luikore 大牛的帖子 http://ruby-china.org/topics/11051

需要 登录 后方可回复, 如果你还没有账号请 注册新账号