JRuby的Kernel #__方法实现了吗?
这是根据Ruby-Doc.org对Kernel#__method__
的描述(强调添加):
以符号forms返回当前方法定义的名称。 如果在方法之外调用,则返回
nil
。
现在考虑以下代码段:
DEFINITION = proc { __method__ } class C define_method :one, DEFINITION define_method :two, DEFINITION end o = C.new
当我使用MRI v1.8.7 +运行以下内容时,我得到了预期的结果:
o.one #=> :one o.two #=> :two
但是当我使用JRuby 1.7+运行相同的代码时(我还没有测试过以前的版本):
o.one #=> :two o.two #=> :two
这可能被认为是JRuby实现中的缺陷还是仅仅是对Kernel#__method__
的不同解释?
它可能是JRuby实现__method__
的缺陷,或者它可能是define_method
实现中的错误,或者它可能严格限于将两者结合使用。 看看如果使用&
运算符将Proc
对象转换为块,会发生什么:
DEFINITION = proc { __method__ } class C define_method :one, &DEFINITION define_method :two, &DEFINITION end o = C.new
现在在MRI中,和以前一样:
o.one #=> :one o.two #=> :two
但是,在JRuby中,它是固定的:
o.one #=> :one o.two #=> :two
鉴于MRI的define_method
的内部实现,其中包括处理Proc
参数vs块参数,如果JRuby完全相似,那么问题也可能存在。
无论哪种方式,通过将self
, binding
, object_id
或它们的任何组合或排列替换为__method__
,都没有找到__method__
,因此问题肯定局限于__method__
使用。
更新:扭曲结束
这是MRI 1.9.2中的一个已知错误 ,JRuby的实现反映了这种行为。
- 在Rails DB中使用CamelCase而不是snake_case
- 从jruby-complete中消耗gem
- Rails架构创建问题
- 无法编写核心转储。 核心转储已被禁用。 要启用核心转储,请在再次启动Java之前尝试“ulimit -c unlimited”
- 你如何为高吞吐量multithreadingRails应用选择gem?
- 调试器(Intellij IDEA)在遇到断点时失败(黄瓜,ruby,rspec,水豚)
- 使用JRuby将Ruby on Rails应用程序的所有.rb文件编译为.class,将其打包成.war并部署到Java appserver中
- 使用JRuby(Hpricot?)解析XML,使用之类的标签
- 无法使用JRuby构建gem原生扩展