Ö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 kendiniz yazmanız, değeri saklamadan ö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 yükselterek bir değeri de reddedebilir. Örnek değişken yalnızca değer denetimi geçerse 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; ayarlayıcının döndürdüğü veya sakladığı değeri değil. Saklanan değeri görmek için özniteliği yeniden 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 okuyup değiştirebileceği, ancak yalnızca geçerli değerlere ayarlayabileceği bir öznitelik 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= ayarlayıcısı değerin çevresindeki boşlukları kaldırır ve her kelimenin ilk harfini büyük yapar ( ada lovelace , Ada Lovelace olur). age= ayarlayıcısı, yaş 0 ile 150 aralığının dışındaysa invalid age: 200 mesajıyla ArgumentError hatası verir; aksi hâlde değeri kaydeder. Her iki değer de okunabilir.
Yeni bir Person, adı Unknown ve yaşı 0 olarak başlar. Sağlanan kod, name text veya age n komutlarını okur, bunları ayarlayıcılar aracılığıyla uygular ve her komuttan sonra kişiyi Ada Lovelace (36) olarak yazdırır; ayarlayıcı değeri kabul etmezse hata mesajını yazdırır.
Kodun person.rb dosyasına yazılmalı. 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