Ini beberapa kode:
class Person
def initialize(age)
@age = age
end
def age
@age
end
def age_difference_with(other_person)
(self.age - other_person.age).abs
end
protected :age
end
Apa yang saya ingin tahu adalah perbedaan antara menggunakan @age
dan self.age
di age_difference_with
metode.
ruby
self
instance-variables
sarunw
sumber
sumber
Perbedaannya adalah bahwa ia mengisolasi penggunaan metode dari implementasi itu. Jika implementasi properti diubah - katakan untuk menjaga tanggal lahir dan kemudian hitung usia berdasarkan perbedaan waktu antara sekarang dan tanggal lahir - maka kode tergantung pada metode tidak perlu diubah. Jika menggunakan properti secara langsung, maka perubahan perlu disebarkan ke area kode yang lain. Dalam hal ini, menggunakan properti secara langsung lebih rapuh daripada menggunakan antarmuka kelas yang disediakan untuk itu.
sumber
Berhati-hatilah ketika Anda mewarisi kelas
Struct.new
yang merupakan cara yang rapi untuk menghasilkan intializer ( Bagaimana cara menghasilkan initializer di Ruby? )akan kembali
Namun, ketika Anda menghapus initializer, itu akan kembali
Dengan definisi kelas
Anda harus menyediakan konstruktor.
akan kembali
sumber
Jawaban pertama sepenuhnya benar, tetapi sebagai pemula relatif tidak segera jelas bagi saya apa yang tersirat (mengirim pesan ke diri sendiri? Eh ya ...). Saya pikir contoh singkat akan membantu:
sumber
Tidak ada perbedaan. Saya menduga itu dilakukan hanya untuk nilai dokumenter melihat
self.age
danother_person.age
berdekatan.Saya kira penggunaan itu memungkinkan pengambil aktual untuk ditulis di masa depan, yang mungkin melakukan sesuatu yang lebih kompleks daripada hanya mengembalikan variabel instan, dan dalam hal ini metode tersebut tidak perlu diubah.
Tapi itu abstraksi yang tidak perlu dikhawatirkan, jika implementasi objek berubah, masuk akal untuk mengubah metode lain, pada beberapa titik referensi sederhana di dalam objek itu sendiri sangat masuk akal.
Dalam kasus apa pun, abstraksi
age
properti masih tidak menjelaskan penggunaan eksplisitself
, karena hanya polosage
juga akan memanggil pengakses.sumber
@age - jelas merupakan usia variabel instan
self.age - mengacu pada usia properti instan.
sumber