论坛首页 Ruby版 ruby

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

浏览 1996 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2008-07-16
 class Aaa  
     attr_accessor :name  
     def get_name  
     @name  
 end  
     def put(name)  
         @name=name  
         aa="hello"  
         class<<aa  
             def print_hello  
              STDOUT.puts self+Aaa::get_name  
             end  
         end  
           
         aa.print_hello  
     end  
 end  
 z=Aaa.new  
 z.put "pp"  

这段代码,我希望输出 hellopp
Aaa::get_name我试过替换成@name,name,get_name都失败了。。
   
时间:2008-07-16
 class Aaa    
     attr_accessor :name    
     def get_name    
     	 @name    
     end    
     def put(name)    
         self.name=name          
         aa="hello"    
         class<<aa    
             def print_hello(outer_class)
              STDOUT.puts self+outer_class.get_name    
             end    
         end    
             
         aa.print_hello(self)
     end    
 end    
 z=Aaa.new    
 z.put "pp"

  不知道内部类怎样直接访问外部类的实例变量,通过把外部类的实例传递给内部类不知道是否能够满足你的需求。

   
0 请登录后投票
时间:2008-07-16
class Aaa 
attr_accessor :name 
def Aaa.get_name() 
@@name 
end 
def put(name) 
@@name=name 
aa="hello" 
class<<aa 
def print_hello 
STDOUT.puts self + Aaa.get_name 
end 
end 
aa.print_hello 
end 
end 
z=Aaa.new 
z.put "pp" 

 自个看吧

 

   
0 请登录后投票
时间:2008-07-16
liuqiang 写道
class Aaa 
attr_accessor :name 
def Aaa.get_name() 
@@name 
end 
def put(name) 
@@name=name 
aa="hello" 
class<<aa 
def print_hello 
STDOUT.puts self + Aaa.get_name 
end 
end 
aa.print_hello 
end 
end 
z=Aaa.new 
z.put "pp" 

 自个看吧

 


谢谢楼上的解答。 但是,我需要访问的是外部类的“实例”变量,不是类变量。 你这样做和我定义个全局的“name”没区别。。 这段代码只是举例用的,实际上我要写的当然比这个复杂了。
   
0 请登录后投票
时间:2008-07-16
phoenix520 写道
 class Aaa    
     attr_accessor :name    
     def get_name    
     	 @name    
     end    
     def put(name)    
         self.name=name          
         aa="hello"    
         class<<aa    
             def print_hello(outer_class)
              STDOUT.puts self+outer_class.get_name    
             end    
         end    
             
         aa.print_hello(self)
     end    
 end    
 z=Aaa.new    
 z.put "pp"

  不知道内部类怎样直接访问外部类的实例变量,通过把外部类的实例传递给内部类不知道是否能够满足你的需求。

当然能满足我要求:)

我现在就是这么实现的,但是我想知道ruby能不能实现直接访问。。java就可以的啊。

   
0 请登录后投票
时间:2008-07-16
ruby 没有内部类的概念呀。
即使声明在内部的, 也只能按普通类的方式!
   
2 请登录后投票
时间:2008-07-16
xiaoxizhen 写道
ruby 没有内部类的概念呀。
即使声明在内部的, 也只能按普通类的方式!

那有许多时候会挺不方便的啊。
要是在一个方法内定义一个class<<AnObj.
实际上这个obj应该默认包含外部object的一个引用的啊。只有外部的object存在,它才会存在
   
0 请登录后投票
时间:2008-07-16
为什么选择在方法内定义class呢?
   
0 请登录后投票
时间:2008-07-16
edge_hh 写道

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


你这完全是照搬java的概念。
你定义的就是singleon方法, 放到哪里不行呀。
   
0 请登录后投票
时间:2008-07-16
这个需求大概可以通过构造闭包来实现,但是ruby中 def 是无法构造闭包的,需要用define_method
还得用到meta class
参考下面代码,不知道是否满足?
代码中的name_alias 和 @name是一个变量,@name在代码块中上下文变了无法获取,弄个bound variable 来获取

module Kernel
  def meta_class
    class << self; self;end
  end
end

class Aaa    
  attr_accessor :name    
  def get_name    
    @name    
  end

  def put(name)
    @name = name
    name_alias = @name 
    aa = "hello"
    aa.meta_class.send(:define_method,:print_hello) do 
      STDOUT.puts self + name_alias
    end
    aa.print_hello
  end
end
z = Aaa.new
z.put "pp"
   
0 请登录后投票
论坛首页 Ruby版 ruby

跳转论坛:
JavaEye推荐