Re: [問題] 抱歉 請教一下 module 和min-in的觀念
首先感謝神肥大大的回應 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
討論串 (同標題文章)
Ruby 近期熱門文章
PTT數位生活區 即時熱門文章