Menu
CoddyTech

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.price

Output:

price must be positive, got -5
10

Ekspresi 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.celsius

Output:

21.7
22

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

Tantangan

Mudah

Lengkapi 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
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Ruby online