Menu
CoddyTech

self dalam method

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Ruby di Coddy. Pelajaran 9 dari 57.

Di dalam method, name = value selalu membuat variabel lokal, bahkan ketika class memiliki setter name=. Untuk memanggil setter, tulis penerimanya: self.name = value:

class Player
  attr_accessor :level

  def initialize
    @level = 1
  end

  def broken_level_up
    level = level + 1
  rescue NoMethodError
    puts "level is a new local variable here, still nil"
  end

  def level_up
    self.level = level + 1
  end
end

p1 = Player.new
p1.broken_level_up
p1.level_up
puts p1.level

Output:

level is a new local variable here, still nil
2

Pembaca tidak memerlukan self.: level dan self.level memanggil method yang sama. Gaya yang umum hanya menulis self. saat Ruby memerlukannya, di depan setter:

class Rect
  attr_accessor :w, :h

  def initialize(w, h)
    @w = w
    @h = h
  end

  def area
    w * h
  end

  def double!
    self.w = w * 2
    self.h = self.h * 2
    self
  end
end

puts Rect.new(2, 3).double!.area

Output:

24

Memanggil setter dari initialize dengan self. membuat object baru melewati pemeriksaan yang sama seperti perubahan berikutnya, sehingga aturan hanya ditulis di satu tempat:

class Product
  attr_reader :price

  def initialize(price)
    self.price = price
  end

  def price=(value)
    raise ArgumentError, "price must be positive" if value <= 0

    @price = value
  end
end

puts Product.new(5).price
begin
  Product.new(0)
rescue ArgumentError => e
  puts e.message
end

Output:

5
price must be positive

Makna self bergantung pada tempat kodemu dijalankan. Di dalam method instans, self adalah instans tersebut. Di dalam isi class, di luar semua method, self adalah class itu sendiri:

class Robot
  puts "in the class body, self is #{self}"

  def whoami
    "in a method, self is a #{self.class}"
  end
end

puts Robot.new.whoami

Output:

in the class body, self is Robot
in a method, self is a Robot
challenge icon

Tantangan

Mudah

class Account memiliki setter kustom balance= yang memunculkan ArgumentError dengan balance cannot be negative untuk nilai di bawah 0. Lengkapi initialize(owner, balance), deposit(amount), dan withdraw(amount) agar setiap perubahan balance menggunakan setter tersebut dengan self., termasuk balance awal.

Code yang disediakan membaca owner dan balance awal, lalu perintah +n (deposit) atau -n (withdraw). Code mencetak Ada: 120 setelah setiap perintah, atau pesan error dan balance yang tidak berubah. Balance awal yang tidak valid hanya mencetak pesan error.

Letakkan kodemu di account.rb. main.rb berisi code input/output yang disediakan dan tidak dapat diedit.

Coba sendiri

require_relative 'account'

# Kode input/output yang disediakan: biarkan apa adanya
input = []
while (line = gets)
  input << line.chomp
end
begin
  account = Account.new(input[0], input[1].to_i)
  input.drop(2).each do |cmd|
    begin
      amount = cmd[1..].to_i
      cmd.start_with?("+") ? account.deposit(amount) : account.withdraw(amount)
    rescue ArgumentError => e
      puts e.message
    end
    puts "#{account.owner}: #{account.balance}"
  end
rescue ArgumentError => e
  puts e.message
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