Menu
CoddyTech

Ö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
10

Bir 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
22

Bir 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
end
challenge icon

Görev

Kolay

Person 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
quiz iconKendini test et

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

Kendi başına pratik yap: Online Ruby derleyicisi