作者softwind (softwind rising)
看板Ruby
标题Re: [问题] 抱歉 请教一下 module 和min-in的观念
时间Tue May 29 00:44:47 2007
首先感谢神肥大大的回应 and 我又打错字了
是 mix-in阿... ...(明明精神很好...)
※ 引述《godfat (godfat 真常)》之铭言:
: ※ 引述《softwind (softwind rising)》之铭言:
: : 像是混入 Enumerable 和Comparable
: : 这边 个人认为很像是 interface观念
: no, 硬要说反而比较像继承,Java interface 没有实作的观念
sorry 这边小弟有点不太清楚
在 Java中 interface 本身也是不可以被具象化
interface基本上就是提供一个物件的 动作/行为的规格
interface本身是一个空壳
必须被继承者实作了之後 该类别才能具象化
这个方法似乎是解决 Java不可以 多重继承
却又该类别希望带有多种相似动作的方法(感觉ruby也是如此)
(Head first Java中说 "java的interface就像是100%的纯抽象class" )
: : 不知道板上大大 有没有过类似的用法 (实际应用时)
: 什麽意思?什麽时候不算实际应用?
sorry 这边我也没有说清楚
以书上(Ruby programming) 的说法 module的用途
1. 提供命名空间
2. 以mix-in的方式提供功能
第1个 应该就是 c++ or java中 namespace or package的观念(吧???)
而第2个 感觉很像是 interface...
例如说 @Guide, class Array 有mix-in
module Enumerable 所以 可以将Enumerable 视为 Array这个class的
一种操作规格
而这些 module的方法 必须被 Array实作出来
如此Array.new 才能用(吧??? 是吗???)
又例如 module Observable
他本身 就提供 add_observer 的功能
include Observable的class ... 嗯... 不用实作
因为他已经做好了...
(该死 我又搬石头砸自己的脚了...)
这样来看的话 module 是可以拥有实作的 不只是规格的宣告而已...
但是 又可以偷偷绕过 类似Java的不可以多重继承的问题 (哈)
: : 再请教一下 guide上面说module是不可以直接实体化的
: : 不过 module Math 含有常数 PI, E
: : 这种常数宣告是类似 class中 class variable的写法吗?
: : (如果是Java 可以用final... 不过 Ruby...?)
: capitalized words are constants
: 开头字母大写的字是常数,不过他的意思是不能再指向另一个实体,
: 而非 C++ 中 const 的概念:「物件不能再被更改」。
恩 这个我也有查到 谢谢
: 在 Ruby 中,物件不能再被更改是由内部的 frozen state 记录。
: (上一篇提到的 frozen state 就用在这里)
: obj.freeze # now obj is forzen, can't modify any state for now on
: 至於 Java 的 final 我不太确定… XD
: 我想 Java 是没有 C++ const 的概念,
: 应该比较类似 Ruby 的 capitalized words 吧?
: module Math
: PI = 3.1415926
: end
: 像是这样写。
: : module不能直接实体化 那module是不是不可以包含
: : instance variable???
: module 的 instance variable 会变成 mixee 的 instance variable
: module M
: attr_accessor :test
: end
: class C
: include M
: end
: 相近於:(说是相近因为 mixin 其实是 ref 关系而非 meta-programming)
: class C
: def test; @test; end
: def test=(new_test); @test = new_test; end
: end
这边 想讨论一下
例如说
module M
attr_accessor :M_var
end
class C
include M
end
c1 = C.new(...)
c2 = C.new(...)
c1. M_var == c2.M_var ->???
c1.M_var.eql? c2.M_var ->??
像上面这个例子 应该是? (我等等敲敲code好了)
(如果 是"个别"实体化的话 应该是 true, false)
: : 因为 class < aObject 的用法
: : 让小弟觉得很不可思议 (Ruby!=Java ...)
: 这是什麽意思…?应该不是指 less than operator 吧?
: 是说 singleton instance 吗?
一切都是我的错...
class Hello
attr_accessor :name
end
obj=Hello.new("John")
class << Hello #到底是'<'(继承) 还是'<<'(类别方法)
def output
puts "Hello "+@name
end
end
Hello.output #--> "Hello John"
and 最後 感谢神肥大 回应我这很 低阶...(能? @@")的问题
THX
------------------------
module N
end
module M < N
^^^
end
不行这样用... 太恶搞了吗?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.129.39.236