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.levelOutput:
level is a new local variable here, still nil
2Pembaca 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!.areaOutput:
24Memanggil 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
endOutput:
5
price must be positiveMakna 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.whoamiOutput:
in the class body, self is Robot
in a method, self is a RobotTantangan
Mudahclass 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
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1class dan object
Bekerja dengan fileMendefinisikan classVariabel instansmethod dan selfto_s dan inspectRingkasan: Kartu Perpustakaan4Enkapsulasi
private methodprotected methodprivate setterMelindungi StatusUlasan, Mesin Penjual Otomatis7Polimorfisme dan Duck Typing
PolimorfismeDuck TypingMethod Abstrakcase dan classRingkasan: Method Pembayaran2Accessor dan self
Pembaca dan PenulisSetter Kustomself dalam methodIdentitas dan KesetaraanRangkuman: Daftar Kontak8Special method
Kesetaraan dan hashOperator methodPengindeksan dan penambahanKoleksi kustomRingkasan: Pecahan11Proyek: Manajemen Perpustakaan
Buku dan AnggotaMeminjam Buku3Method dan Variabel class
Method classVariabel instance classKonstantaMethod pabrikRangkuman: Kode KuponLatihan sendiri: Compiler Ruby online