论坛首页 Ruby版 ruby

RUBY内部类怎么访问外部类的变量

浏览 2564 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2008-07-17
昨天晚上回家翻书看了看
class<<AnObj
这个是扩展了AnObj,并不是一个java思想中的内部类。
内部类应该是使用::实现的,这样才是内部类,他就可以直接使用超类的方法了。

看来需要另外一个思想来实现LZ需要的功能!
   
0 请登录后投票
最后更新时间:2008-07-17
xiaoxizhen 写道
edge_hh 写道

那有许多时候会挺不方便的啊。
要是在一个方法内定义一个class<<AnObj.
实际上这个obj应该默认包含外部object的一个引用的啊。只有外部的object存在,它才会存在


你这完全是照搬java的概念。
你定义的就是singleon方法, 放到哪里不行呀。


我说了,我的例子只是为了举例用的。
当然是我实际上有这个需求我才这么问的。
   
0 请登录后投票
最后更新时间:2008-07-17
superxielei 写道
昨天晚上回家翻书看了看
class<<AnObj
这个是扩展了AnObj,并不是一个java思想中的内部类。
内部类应该是使用::实现的,这样才是内部类,他就可以直接使用超类的方法了。

看来需要另外一个思想来实现LZ需要的功能!

我称为内部类是因为这个类只是随着外面这个类的instance存在而存在的。
   
0 请登录后投票
最后更新时间: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提供内部类是不可能或者比较难的。
   
0 请登录后投票
最后更新时间: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内部类怎么访问外部类的变量”

这两句话还是有点区别的。。
   
0 请登录后投票
最后更新时间: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说你要怎么写才行
   
0 请登录后投票
最后更新时间:2008-07-28
matz的书上说,在ruby里变量的作用域是不包含到嵌套类或者函数里的。但是常量可以。顾名思义常量是不可以更改值, 但是我们可以用个小把戏绕过这个规定, 就是第2行那个Name = []
   
0 请登录后投票
最后更新时间: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
   
0 请登录后投票
最后更新时间: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
   
0 请登录后投票
最后更新时间: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

这是我目前的实现。
   
0 请登录后投票
论坛首页 Ruby版 ruby

跳转论坛:
JavaEye推荐