有什麼區別:區別 「A級; B類」 和 「類A :: B」
class A
class B
end
end
和
class A
end
class A::B
end
更新:這兩個方法都沒有一模一樣。
在第二種方法中,B
無法訪問A
中定義的常量。
另外,作爲馬修斯莫雷拉正確地指出,在第二方法中,A
必須A::B
之前定義可以被定義。
還有什麼其他的不同嗎?
有什麼區別:區別 「A級; B類」 和 「類A :: B」
class A
class B
end
end
和
class A
end
class A::B
end
更新:這兩個方法都沒有一模一樣。
在第二種方法中,B
無法訪問A
中定義的常量。
另外,作爲馬修斯莫雷拉正確地指出,在第二方法中,A
必須A::B
之前定義可以被定義。
還有什麼其他的不同嗎?
在Ruby中,模塊和類分別是Module
和Class
類的實例,。他們從他們被分配到的常數中得到他們的名字。當你寫:
class A::B
# ...
end
您有效地寫着:
A::B ||= Class.new do
# ...
end
有效期不變賦值語法和假定的A
恆已經正確初始化和,它指的是Module
或Class
。
例如,考慮類是如何通常定義:
class A
# ...
end
什麼是有效的情況是這樣的:
Object::A ||= Class.new do
# ...
end
現在,當你寫:
class A
class B
# ...
end
end
究竟是什麼碰巧看起來像這樣:
(Object::A ||= Class.new).class_eval do
(A::B ||= Class.new).class_eval do
# ...
end
end
這裏發生了什麼,以便:
Class
實例asssigned到Object
的A
不變,除非它已經被初始化。Class
實例被分配到B
常量A
,除非它已經被初始化。這確保試圖定義任何內部類之前所有外類存在。
範圍也有變化,可以直接訪問A
的常量。比較:
class A
MESSAGE = "I'm here!"
end
# Scope of Object
class A::B
# Scope of B
puts MESSAGE # NameError: uninitialized constant A::B::MESSAGE
end
# Scope of Object
class A
# Scope of A
class B
# Scope of B
puts MESSAGE # I'm here!
end
end
據this blog post,Ruby的核心團隊稱之爲 「當前類的」 cref
。不幸的是,作者沒有詳細說明,但正如他指出的,它與self
的背景是分開的。
As explained here,該cref
是鏈表表示模塊在某個時間點上築巢。
當前
cref
用於恆定和類變量查找和 爲def
,undef
和alias
。
正如其他人所說,他們表達了同樣的事情不同的方式。
但是,有一個微妙的區別。當您編寫class A::B
時,您的假定A
類已被定義。如果沒有,你將得到一個NameError
和B
根本不會被定義。
編寫正確的嵌套模塊:
class A
class B
end
end
確保A
類存在試圖定義B
之前。
兩種不同的方式來說相同的事情。那就是B類是內部類或嵌套類,只能通過A接口訪問。
> class A
.. def say
.... "In A"
....end
..
.. class B
.... def say
...... "In B"
......end
....end
..end
=> nil
> A.new.say
=> "In A"
> B.new.say
=> #<NameError: uninitialized constant B>
> A::B.new.say
=> "In B"
與
> class A
.. def say
.... "In A"
....end
..end
=> nil
> class A::B
.. def say
.... "In B"
....end
..end
=> nil
> A.new.say
=> "In A"
> B.new.say
=> #<NameError: uninitialized constant B>
> A::B.new.say
=> "In B"
>
我已更新問題以顯示這兩種方法不一樣。 – nickh 2012-03-16 17:14:37
我已更新問題以顯示這兩種方法不相同。 – nickh 2012-03-16 17:14:43
@nickh,你不需要編輯問題來包含答案。你應該[upvote有用的答案,並接受肯定回答你的問題](http://stackoverflow.com/faq#howtoask)。 – 2012-03-16 17:47:21
事情是,他們都沒有回答這個問題。所有的答案都說2種方法是相同的,但他們並不相同。 – nickh 2012-03-16 18:36:50