|
精华帖 (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都失败了。。 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间: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"
不知道内部类怎样直接访问外部类的实例变量,通过把外部类的实例传递给内部类不知道是否能够满足你的需求。 |
|
| 返回顶楼 | |
|
时间: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" 自个看吧
|
|
| 返回顶楼 | |
|
时间: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”没区别。。 这段代码只是举例用的,实际上我要写的当然比这个复杂了。 |
|
| 返回顶楼 | |
|
时间: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就可以的啊。 |
|
| 返回顶楼 | |
|
时间:2008-07-16
ruby 没有内部类的概念呀。
即使声明在内部的, 也只能按普通类的方式! |
|
| 返回顶楼 | |
|
时间:2008-07-16
xiaoxizhen 写道 ruby 没有内部类的概念呀。 即使声明在内部的, 也只能按普通类的方式! 那有许多时候会挺不方便的啊。 要是在一个方法内定义一个class<<AnObj. 实际上这个obj应该默认包含外部object的一个引用的啊。只有外部的object存在,它才会存在 |
|
| 返回顶楼 | |
|
时间:2008-07-16
为什么选择在方法内定义class呢?
|
|
| 返回顶楼 | |
|
时间:2008-07-16
edge_hh 写道 那有许多时候会挺不方便的啊。 要是在一个方法内定义一个class<<AnObj. 实际上这个obj应该默认包含外部object的一个引用的啊。只有外部的object存在,它才会存在 你这完全是照搬java的概念。 你定义的就是singleon方法, 放到哪里不行呀。 |
|
| 返回顶楼 | |
|
时间: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"
|
|
| 返回顶楼 | |







