Setter Kustom
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Ruby di Coddy. Pelajaran 8 dari 57.
Setter adalah method yang namanya diakhiri dengan =. Menulisnya sendiri alih-alih menggunakan attr_writer memungkinkan method tersebut merapikan nilai sebelum menyimpannya:
class Person
attr_reader :name
def name=(value)
@name = value.strip.capitalize
end
end
ada = Person.new
ada.name = " aDA "
puts "[#{ada.name}]"Output:
[Ada]Sebuah setter juga dapat menolak nilai dengan memunculkan error. Variabel instance hanya ditetapkan ketika nilai lolos pemeriksaan, sehingga object tetap mempertahankan keadaannya yang lama:
class Product
attr_reader :price
def initialize(price)
@price = price
end
def price=(value)
raise ArgumentError, "price must be positive, got #{value}" if value <= 0
@price = value
end
end
item = Product.new(10)
begin
item.price = -5
rescue ArgumentError => e
puts e.message
end
puts item.priceOutput:
price must be positive, got -5
10Ekspresi assignment selalu mengembalikan nilai di sisi kanannya, bukan nilai yang dikembalikan atau disimpan oleh setter. Baca atribut itu lagi untuk melihat nilai yang tersimpan:
class Thermometer
attr_reader :celsius
def celsius=(value)
@celsius = value.round
end
end
t = Thermometer.new
result = (t.celsius = 21.7)
puts result
puts t.celsiusOutput:
21.7
22reader dan setter khusus secara bersamaan memberikan atribut yang dapat dibaca dan diubah oleh kode di luar, tetapi hanya dengan nilai yang valid. Letakkan pemeriksaan hanya di setter, agar setiap perubahan mengikuti aturan yang sama:
class Volume
attr_reader :level
def level=(value)
raise ArgumentError, "level must be 0-10" unless (0..10).cover?(value)
@level = value
end
endTantangan
MudahLengkapi class Person. Setter name= menghapus spasi di sekitar nilai dan mengubah huruf pertama setiap kata menjadi huruf kapital ( ada lovelace menjadi Ada Lovelace). Setter age= memunculkan ArgumentError dengan pesan invalid age: 200 saat usia berada di luar rentang 0 hingga 150, dan menyimpannya jika tidak. Kedua nilai dapat dibaca.
Person baru dimulai dengan nama Unknown dan usia 0. Kode yang disediakan membaca perintah name text atau age n, menerapkannya melalui setter, lalu mencetak data orang tersebut sebagai Ada Lovelace (36) setelah setiap perintah, atau mencetak pesan error saat setter menolak nilainya.
Tulis kodemu di person.rb. main.rb berisi kode input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
require_relative 'person'
# Kode input/output yang disediakan: biarkan tetap seperti ini
input = []
while (line = gets)
input << line.chomp
end
person = Person.new
input.each do |line|
command, value = line.split(" ", 2)
begin
command == "name" ? person.name = value : person.age = value.to_i
puts "#{person.name} (#{person.age})"
rescue ArgumentError => e
puts e.message
end
end
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1class dan object
Bekerja dengan fileMendefinisikan classVariabel instansmethod dan selfto_s dan inspectRingkasan: Kartu Perpustakaan4Enkapsulasi
private methodprotected methodprivate setterMelindungi StatusUlasan, Mesin Penjual Otomatis7Polimorfisme dan Duck Typing
PolimorfismeDuck TypingMethod Abstrakcase dan classRingkasan: Method Pembayaran2Accessor dan self
Pembaca dan PenulisSetter Kustomself dalam methodIdentitas dan KesetaraanRangkuman: Daftar Kontak8Special method
Kesetaraan dan hashOperator methodPengindeksan dan penambahanKoleksi kustomRingkasan: Pecahan11Proyek: Manajemen Perpustakaan
Buku dan AnggotaMeminjam Buku3Method dan Variabel class
Method classVariabel instance classKonstantaMethod pabrikRangkuman: Kode KuponLatihan sendiri: Compiler Ruby online