🌿 What?
-
🌱 Ở Ruby 2.7, class variable được sử dụng chung giữa class cha và các class con. Do có thể overwrite ở bất cứ đâu nên sẽ khó để tracking hoặc debug.
-
🌱 Đến Ruby 3.0, class variable chỉ có thể overwrite ở các Class con kế thừa hoặc ở chính Class đó.
class Dog
@@color = ['yellow']
# bad practice
def self.overwrite_legs!
@@legs = 4
end
def self.overwrite_legs!
@@color
end
end
class Husky < Dog
@@legs = 2
def self.show_legs
@@legs
end
# good practice
def self.add_color
@@color.push 'green'
end
end
#=> Dog.overwrite_legs!
#=> 4
#=> Husky.show_legs
#=> in `show_legs': class variable @@legs of Husky is overtaken by Dog (RuntimeError)
--------------------------
#=> Husky.add_color
#=> ["yellow", "green"]
#=> Dog.show_color
#=> ["yellow", "green"]