Menu
Coddy logo textTech

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

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

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

Görev

Kolay

Person 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
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