首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python,如Ruby / JRuby的__getattr__

Python,如Ruby / JRuby的__getattr__
EN

Stack Overflow用户
提问于 2011-11-29 03:09:43
回答 3查看 601关注 0票数 4

有没有类似Python的__getattr__?在Python语言中,当引用未定义的属性(方法或属性)时会调用obj.__getattr__。我在Ruby语言中发现了method_missing,但它不适用于属性。

我的用例是:将Mirah作为JRuby -> Java编译器进行测试。在标准的JRuby中,Swing方法和属性是“Ruby化的”(例如: label.setText "x“=> label.text = "x"),但在Mirah中不是这样,因为Mirah没有像JRuby那样的专用运行时库。然后,我希望在运行时获得属性引用,并将每个调用映射到相应的Swing方法(label.text => label.getText() / label.text = "x“=> label.setText("x") )。

EN

回答 3

Stack Overflow用户

发布于 2011-11-29 03:42:58

我不确定这是否涵盖了您的用例,但总的来说,method_missing应该可以做到这一点。您如何期望Ruby类知道未定义的方法和未定义的“属性”之间的区别?它所知道的就是传递了一个它无法识别的名称。它应该是一个方法还是一个属性?谁知道呢?除非您讨论的是setter属性,在这种情况下,名称后面会附加一个=

代码语言:javascript
复制
 class X
   def method_missing name,*args
     puts "missing '#{name}' called with #{args}"
   end
 end  

代码语言:javascript
复制
> x = X.new
=> #<X:0xe6b322>
> x.unknown_method
missing 'unknown_method' called with []
=> nil
> x.unknown_property
missing 'unknown_property' called with []
=> nil
> x.unknown_property= 42
missing 'unknown_property=' called with [42]
=> 42     
票数 3
EN

Stack Overflow用户

发布于 2011-11-29 03:22:06

JRuby通过遍历反射类的方法并为Ruby名添加别名,在Java代码中完成这种转换。你也可以在Ruby中做到这一点。Mirah可以访问您正在编译的所有类的实际java.lang.Class实例,因此可以在编译器阶段使用相同的名称别名。

具体如何做到这一点的细节留给读者作为练习:)

票数 1
EN

Stack Overflow用户

发布于 2011-11-29 03:58:17

Ruby中的对象没有“属性”。它们有实例变量(每个实例存储数据的私有变量)和可以访问这些变量的方法。

由于括号在Ruby方法调用中是可选的,并且语法糖允许您将obj.foo = 42作为一种更好的方法来调用方法obj.foo=( 42 ),因此您可能认为这些都是属性。它们不是;它们是无法与任何其他方法区分的方法。

这段代码:

代码语言:javascript
复制
class Foo
   attr_accessor :bar
end
f = Foo.new
f.bar = 42
puts f.bar  #=> 42

与下面的(长得多的)代码完全相同:

代码语言:javascript
复制
class Foo
  def bar
    @bar
  end
  def bar=( val )
    @bar = val
  end
end
f = Foo.new
f.bar=( 42 )
puts( f.bar() ) #=> 42

attr_*方法实际上为您创建方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8300956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档