Project1

标题: 这个语言有没有1个类似映射的方法 [打印本页]

作者: sizz123    时间: 2008-2-4 00:55
标题: 这个语言有没有1个类似映射的方法
   xx,yy,zz是3个已知类,能不能写个新的类,向那3个已知类中各自添加1个方法?        

class xx
end

class yy
end

class yy
end
[LINE]1,#dddddd[/LINE]此贴于 2008-2-5 17:58:03 被版主水迭澜提醒,请楼主看到后对本贴做出回应。 [LINE]1,#dddddd[/LINE]版务信息:版主帮忙结贴~
作者: 水迭澜    时间: 2008-2-4 00:56
class xxxx
  def abcd
    return xxx
  end
end

用alias可以重定义方法……映射是什么……能否翻译成英文orz
作者: Eclair    时间: 2008-2-4 01:00
提示: 作者被禁止或删除 内容自动屏蔽
作者: 水迭澜    时间: 2008-2-4 01:01
orz……我学编程的教材是英文……导致很多名词和概念都很混淆地说= =
好像确实不能同时给三个类增加方法吧= =
作者: Eclair    时间: 2008-2-4 01:05
提示: 作者被禁止或删除 内容自动屏蔽
作者: 水迭澜    时间: 2008-2-4 01:09
用力握爪,俺最先接触的也是那只海龟orz
第二个是vb,然后是c++.....然后是RGSS……现在在痛苦地学java……= =
不是我要学这么多的……天知道我们学校怎么设置课程的……学c++之后的进阶课程竟然使用java上……orz
作者: sizz123    时间: 2008-2-4 01:12
以下引用Eclair于2008-2-3 17:05:37的发言:

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


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

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


作者: 叶子    时间: 2008-2-4 11:39
可以用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 13:09
以下引用叶子于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.
作者: 叶子    时间: 2008-2-4 18:50
以下引用美兽于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"
[LINE]1,#dddddd[/LINE]系统信息:本贴由本区版主认可为正确答案,66RPG感谢您的热情解答~




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1