|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2008-07-17
昨天晚上回家翻书看了看
class<<AnObj 这个是扩展了AnObj,并不是一个java思想中的内部类。 内部类应该是使用::实现的,这样才是内部类,他就可以直接使用超类的方法了。 看来需要另外一个思想来实现LZ需要的功能! |
|
| 返回顶楼 | |
|
时间:2008-07-17
xiaoxizhen 写道 edge_hh 写道 那有许多时候会挺不方便的啊。 要是在一个方法内定义一个class<<AnObj. 实际上这个obj应该默认包含外部object的一个引用的啊。只有外部的object存在,它才会存在 你这完全是照搬java的概念。 你定义的就是singleon方法, 放到哪里不行呀。 我说了,我的例子只是为了举例用的。 当然是我实际上有这个需求我才这么问的。 |
|
| 返回顶楼 | |
|
时间:2008-07-17
superxielei 写道 昨天晚上回家翻书看了看
class<<AnObj 这个是扩展了AnObj,并不是一个java思想中的内部类。 内部类应该是使用::实现的,这样才是内部类,他就可以直接使用超类的方法了。 看来需要另外一个思想来实现LZ需要的功能! 我称为内部类是因为这个类只是随着外面这个类的instance存在而存在的。 |
|
| 返回顶楼 | |
|
时间:2008-07-17
你只是定义了一个变量,然后给变量追加了一个方法。
动态追加方法, def和define_method的区别可以参考这边文章。 http://ola-bini.blogspot.com/2008/05/dynamically-created-methods-in-ruby.html 这里还有一篇中文的翻译。 http://www.gotopeking.com/boards/1/topics/show/65 对于你的需求,直接把外部的引用传过去就是最简单的方法了。 如果你不相信我, rails里面有类似的 lib\action_controller\routing\route_set.rb 看看里面的Mapper 如果你还要问为什么ruby不提供跟java一样的内部类 想想ruby的open class。 我觉得正因为有open class,所以ruby提供内部类是不可能或者比较难的。 |
|
| 返回顶楼 | |
|
时间:2008-07-17
xiaoxizhen 写道 你只是定义了一个变量,然后给变量追加了一个方法。 动态追加方法, def和define_method的区别可以参考这边文章。 http://ola-bini.blogspot.com/2008/05/dynamically-created-methods-in-ruby.html 这里还有一篇中文的翻译。 http://www.gotopeking.com/boards/1/topics/show/65 对于你的需求,直接把外部的引用传过去就是最简单的方法了。 如果你不相信我, rails里面有类似的 lib\action_controller\routing\route_set.rb 看看里面的Mapper 如果你还要问为什么ruby不提供跟java一样的内部类 想想ruby的open class。 我觉得正因为有open class,所以ruby提供内部类是不可能或者比较难的。 谢谢你提供的文档:) 看来你没弄懂我问的。 我不是问 “为什么ruby不提供跟java一样的内部类” 而是问 “RUBY内部类怎么访问外部类的变量” 这两句话还是有点区别的。。 |
|
| 返回顶楼 | |
|
时间:2008-07-28
class Aaa
Name = [] #attr_accessor :name
def get_name
Name[0]
end
def put(name)
Name[0]=name
aa="hello"
class<<aa
def print_hello
STDOUT.puts self+Name[0]
end
end
aa.print_hello
end
end
z=Aaa.new
z.put "pp"
matz说你要怎么写才行 |
|
| 返回顶楼 | |
|
时间:2008-07-28
matz的书上说,在ruby里变量的作用域是不包含到嵌套类或者函数里的。但是常量可以。顾名思义常量是不可以更改值, 但是我们可以用个小把戏绕过这个规定, 就是第2行那个Name = []
|
|
| 返回顶楼 | |
|
时间:2008-07-28
matz的书指的是将近10年前的老书:
http://www.amazon.co.jp/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E3%82%B9%E3%82%AF%E3%83%AA%E3%83%97%E3%83%88%E8%A8%80%E8%AA%9E-ASCII-SOFTWARE-SCIENCE-Language/dp/4756132545/ref=sr_1_14?ie=UTF8&s=books&qid=1217257093&sr=1-14 |
|
| 返回顶楼 | |
|
时间:2008-08-01
baryon 写道 class Aaa
Name = [] #attr_accessor :name
def get_name
Name[0]
end
def put(name)
Name[0]=name
aa="hello"
class<<aa
def print_hello
STDOUT.puts self+Name[0]
end
end
aa.print_hello
end
end
z=Aaa.new
z.put "pp"
matz说你要怎么写才行 受教了 class Aaa
Name = [] #attr_accessor :name
def set_name name
Name[0]=name
end
def put()
aa="hello"
class<<aa
def print_hello
STDOUT.puts self+","+Name[0]
end
end
aa.print_hello
end
end
a=Aaa.new
a.set_name("edge_hh")
b=Aaa.new
b.set_name("baryon")
a.put
b.put
我希望结果是 hello,edge_hh hello,baryon 现在是 hello,baryon hello,baryon |
|
| 返回顶楼 | |
|
时间:2008-08-01
module Has_inner_class
def init_child obj
class<<obj
def init_outer outer
@__outer=outer
self
end
end
obj.init_outer self
end
end
class Aaa
include Has_inner_class
attr_accessor :name
def put()
aa=init_child("hello")
class<<aa
def print_hello
STDOUT.puts self+","+@__outer.name
end
end
aa.print_hello
end
end
a=Aaa.new
a.name="edge_hh"
b=Aaa.new
b.name="baryon"
a.put
b.put
这是我目前的实现。 |
|
| 返回顶楼 | |




