查看: 1991|回复: 9

这个语言有没有1个类似映射的方法

  [复制链接]
梦石
0
星屑
55
在线时间
20 小时
注册时间
2005-10-24
回帖
1175
发表于 2008-2-4 00:55:12 | 显示全部楼层 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有账号?注册会员

×
   xx,yy,zz是3个已知类,能不能写个新的类,向那3个已知类中各自添加1个方法?        

class xx
end

class yy
end

class yy
end

此贴于 2008-2-5 17:58:03 被版主水迭澜提醒,请楼主看到后对本贴做出回应。
版务信息:版主帮忙结贴~

御灵的宠物

梦石
12
星屑
8481
在线时间
94 小时
注册时间
2006-12-11
回帖
3101

第2届TG大赛亚军

发表于 2008-2-4 00:56:13 | 显示全部楼层
class xxxx
  def abcd
    return xxx
  end
end

用alias可以重定义方法……映射是什么……能否翻译成英文orz
我的Lofter:http://nightoye.lofter.com/

回复

使用道具 举报

头像被屏蔽

心无天使

梦石
0
星屑
49
在线时间
0 小时
注册时间
2007-12-15
回帖
895
发表于 2008-2-4 01:00:15 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复

使用道具 举报

御灵的宠物

梦石
12
星屑
8481
在线时间
94 小时
注册时间
2006-12-11
回帖
3101

第2届TG大赛亚军

发表于 2008-2-4 01:01:59 | 显示全部楼层
orz……我学编程的教材是英文……导致很多名词和概念都很混淆地说= =
好像确实不能同时给三个类增加方法吧= =
我的Lofter:http://nightoye.lofter.com/

回复

使用道具 举报

头像被屏蔽

心无天使

梦石
0
星屑
49
在线时间
0 小时
注册时间
2007-12-15
回帖
895
发表于 2008-2-4 01:05:37 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复

使用道具 举报

御灵的宠物

梦石
12
星屑
8481
在线时间
94 小时
注册时间
2006-12-11
回帖
3101

第2届TG大赛亚军

发表于 2008-2-4 01:09:38 | 显示全部楼层
用力握爪,俺最先接触的也是那只海龟orz
第二个是vb,然后是c++.....然后是RGSS……现在在痛苦地学java……= =
不是我要学这么多的……天知道我们学校怎么设置课程的……学c++之后的进阶课程竟然使用java上……orz
我的Lofter:http://nightoye.lofter.com/

回复

使用道具 举报

梦石
0
星屑
55
在线时间
20 小时
注册时间
2005-10-24
回帖
1175
 楼主| 发表于 2008-2-4 01:12:27 | 显示全部楼层
以下引用Eclair于2008-2-3 17:05:37的发言:

继续otl……
偶米学过专业的编程- -bbb
第一个接触的语言类的东西是那只小海龟,第二个就是RGSS了……


小海龟...记得小霸王学习机中有那个语言卡带{/hx}
最先接触的是g.basic 学习机上编程的专用软件,可以制作"超级马力"的那语言

看来真的是没有那个方法了.

回复

使用道具 举报

梦石
0
星屑
65
在线时间
400 小时
注册时间
2005-10-24
回帖
579
发表于 2008-2-4 11:39:23 | 显示全部楼层
可以用eval实现
class A
end

class B
  
end

class C
end

def define_method_for_class(a_class)
  method_def = "def hello
  p 'Hello'
  end"
  eval("class #{a_class}; #{method_def}; end")
end

define_method_for_class(A)
define_method_for_class(B)
define_method_for_class(C)

A.new.hello # => "Hello"
B.new.hello # => "Hello"
C.new.hello # => "Hello"
回复

使用道具 举报

月下可怜人

梦石
0
星屑
50
在线时间
10 小时
注册时间
2005-11-23
回帖
3667

第1届短篇游戏比赛亚军

发表于 2008-2-4 13:09:05 | 显示全部楼层
以下引用叶子于2008-2-4 3:39:23的发言:

可以用eval实现

class A
end

class B

end

class C
end

def define_method_for_class(a_class)
method_def = "def hello
p 'Hello'
end"
eval("class #{a_class}; #{method_def}; end")
end

define_method_for_class(A)
define_method_for_class(B)
define_method_for_class(C)

A.new.hello # => "Hello"
B.new.hello # => "Hello"
C.new.hello # => "Hello"




[本贴由作者于 2008-2-4 3:40:20 最后编辑]


eval与class_eval追加的方法在重载时会消失,感觉标准的方法仍然是利用超类或者模块mixin.
纵然千里外,我等雁归来。
回复

使用道具 举报

梦石
0
星屑
65
在线时间
400 小时
注册时间
2005-10-24
回帖
579
发表于 2008-2-4 18:50:04 | 显示全部楼层
以下引用美兽于2008-2-4 5:09:04的发言:

eval与class_eval追加的方法在重载时会消失,感觉标准的方法仍然是利用超类或者模块mixin.

重载时消失能否举例?

貌似Marshal的dump和load不影响..
# 反射测试1

class A
end

def define_method_for_class(a_class)
  method_def = "def hello
  p 'Hello'
  end"
  eval("class #{a_class}; #{method_def}; end")
end

define_method_for_class(A)

(Marshal.load(Marshal.dump(A.new))).hello # => "Hello"


另外根据美兽提出的思路,下面两个分别是用模块揉合和调用define_method
(由于include和define_method是私有方法,外部调用的话只能通过send)
# 反射测试2

class A
end

module Hello
  def hello
    p 'Hello'
  end
end

A.send(:include, Hello)

A.new.hello # => "Hello"

# 反射测试3

class B
end

B.send(:define_method, :hello){
p 'Hello'
}

B.new.hello # => "Hello"

系统信息:本贴由本区版主认可为正确答案,66RPG感谢您的热情解答~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部