Özel Setter'lar
Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 8 / 57.
Setter, adı = ile biten bir metottur. attr_writer kullanmak yerine bunu kendiniz yazmak, değeri depolamadan önce temizlemenizi sağlar:
class Person
attr_reader :name
def name=(value)
@name = value.strip.capitalize
end
end
ada = Person.new
ada.name = " aDA "
puts "[#{ada.name}]"Çıktı:
[Ada]Bir setter, hata oluşturarak bir değeri de reddedebilir. Örnek değişken yalnızca değer kontrolden geçtiğinde atanır; böylece nesne eski durumunu korur:
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.priceÇıktı:
price must be positive, got -5
10Bir atama ifadesi her zaman sağ tarafındaki değeri döndürür; atayıcının döndürdüğü veya depoladığı şeyi değil. Depolanan değeri görmek için niteliği tekrar okuyun:
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.celsiusÇıktı:
21.7
22Bir okuyucu ve özel bir setter birlikte, dışarıdaki kodun bir niteliği okuyup değiştirebilmesini, ancak yalnızca geçerli değerlerle yapabilmesini sağlar. Denetimi yalnızca setter'da tutun; böylece her değişiklik aynı kuraldan geçer:
class Volume
attr_reader :level
def level=(value)
raise ArgumentError, "level must be 0-10" unless (0..10).cover?(value)
@level = value
end
endGörev
KolayPerson sınıfını tamamla. name= setter'ı değerin etrafındaki boşlukları kaldırır ve her kelimenin ilk harfini büyütür ( ada lovelace ifadesi Ada Lovelace olur). age= setter'ı yaş 0 ile 150 arasında olmadığında invalid age: 200 mesajıyla ArgumentError oluşturur; aksi halde değeri saklar. Her iki değer de okunabilir.
Yeni bir Person, Unknown adı ve 0 yaşıyla başlar. Sağlanan kod, name text veya age n komutlarını okur, bunları setter'lar aracılığıyla uygular ve her komuttan sonra kişiyi Ada Lovelace (36) olarak yazdırır; setter değeri kabul etmediğinde ise hata mesajını yazdırır.
Kodun person.rb dosyasına yazılmalıdır. main.rb sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
require_relative 'person'
# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Sınıflar ve Nesneler
Dosyalarla ÇalışmaSınıf TanımlamaÖrnek DeğişkenleriMetotlar ve selfto_s ve inspectÖzet - Kütüphane Kartı7Çok Biçimlilik ve Ördek Tiplemesi
Çok BiçimlilikÖrdek TiplemesiSoyut Metotlarcase ve SınıflarTekrar - Ödeme Yöntemleri2Erişimciler ve self
Okuyucular ve YazıcılarÖzel Setter'larMetotlarda selfKimlik ve EşitlikTekrar - Kişi Listesi5Kalıtım
Alt sınıflarMetotları geçersiz kılmasuper çağrısıis_a? ve üst sınıflarTekrar - Personel Maaşları8Özel Metotlar
Eşitlik ve hashOperatör Metotlarıİndeksleme ve EklemeÖzel KoleksiyonlarTekrar - Kesirler11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç Alma3Sınıf Metotları ve Değişkenleri
Sınıf MetotlarıSınıf Örnek DeğişkenleriSabitlerFabrika MetotlarıTekrar - Kupon KodlarıKendi başına pratik yap: Online Ruby derleyicisi