在 Ruby 程式設計中,private 關鍵字的行為與 Java、C++ 等主流語言有著本質區別,這常讓初學者感到困惑。本文將透過程式碼範例與官方文件說明,深入剖析 Ruby 中 private 方法的可見性規則、繼承特性,以及為何 self 會成為呼叫限制的關鍵。
在 Java 中,private 方法僅限於定義它的類別內部存取,子類別無法繼承也無法呼叫。但在 Ruby 中,private 的語義是:「不能指定接收者(receiver)來呼叫」,預設接收者為 self。這意味著:
private 方法。self.method_name 或 obj.method_name,直接寫方法名即可成功呼叫。class Test
private
def test_print
puts 'test'
end
end
class Test2 < Test
def test_print2
# self.test_print # => 錯誤:private method `test_print' called for #<Test2:0x...> (NoMethodError)
test_print # => 正常輸出 "test"
end
end
Test2.new.test_print2
執行結果證明:不加 self 時,Ruby 將當前物件 (self) 作為隱式接收者,允許呼叫;加上 self 即成為「顯式指定接收者」,觸發 private 保護機制而拋出 NoMethodError。
private:類別與子類別皆可呼叫,但 private 方法不可指定接收者,預設接收者為
self。
protected:類別與子類別皆可呼叫,可指定接收者(同類別或子類別實例皆可)。
這段說明完美解釋了上述現象:private 並非「不可見」,而是「不可被顯式派發」。
private,子類別仍可複用邏輯。private 方法時,習慣直接寫方法名,不要加 self.。protected。Ruby 的 private 機制體現了「封裝不等於隱藏繼承」的設計哲學:封裝的是「顯式派發」,而非「可見性」。理解這一點,就能靈活運用 private/protected 設計出既安全又具擴充性的類別體系。