Menu
CoddyTech

Konstanta

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

Sebuah konstanta diawali dengan huruf kapital dan, sesuai konvensi, ditulis dengan huruf kapital. Jika didefinisikan di dalam isi class, konstanta dapat digunakan berdasarkan namanya di setiap method class tersebut. Di luar class, kamu menulis ClassName::NAME:

class Account
  MIN_BALANCE = -100

  def self.allowed?(balance)
    balance >= MIN_BALANCE
  end
end

puts Account::MIN_BALANCE
puts Account.allowed?(-50)
puts Account.allowed?(-150)

Output:

-100
true
false

Konstanta cocok untuk data tetap yang digunakan seluruh class, seperti batas atau tabel lookup. fetch pada konstanta hash memunculkan KeyError untuk key yang tidak dikenal, alih-alih diam-diam mengembalikan nil:

class Shipping
  RATES = { "standard" => 5, "express" => 12 }.freeze

  def self.cost(method)
    RATES.fetch(method)
  end
end

puts Shipping.cost("express")
begin
  Shipping.cost("drone")
rescue KeyError => e
  puts e.message
end

Output:

12
key not found: "drone"

Nama konstanta tidak dapat diarahkan ke object baru tanpa Ruby menampilkan peringatan, tetapi object yang ditampungnya masih dapat diubah. freeze membuat object itu sendiri hanya dapat dibaca, sehingga perubahan akan memunculkan FrozenError:

class Palette
  COLORS = ["red", "green"].freeze
end

begin
  Palette::COLORS << "blue"
rescue FrozenError => e
  puts e.message
end
p Palette::COLORS
p Palette::COLORS.frozen?

output:

can't modify frozen Array: ["red", "green"]
["red", "green"]
true

Pilih berdasarkan cara nilai berperilaku. Nilai yang tidak pernah berubah termasuk dalam konstanta beku; status yang berubah saat program berjalan, seperti penghitung, termasuk dalam variabel instance class:

class Ticket
  PREFIX = "TK"                  # tetap: sebuah konstanta
  @issued = 0                    # berubah: variabel instance class

  def self.next_code
    @issued += 1
    "#{PREFIX}-#{@issued}"
  end
end
challenge icon

Tantangan

Mudah

Lengkapi class Order. Class ini memiliki konstanta RATES (hash yang dibekukan: standard berharga 5, express 12, pickup 0) dan FREE_FROM (50). initialize(total, method) memunculkan ArgumentError dengan unknown shipping: drone ketika method bukan kunci dalam RATES. shipping mengembalikan 0 untuk total mulai dari FREE_FROM ke atas, dan tarifnya jika tidak. to_s mengembalikan 40.00 + 5 express = 45.00.

Kode yang disediakan mencetak free from 50 menggunakan konstanta tersebut, lalu membaca pesanan dalam baris berformat total method dan mencetak setiap pesanan atau pesan error.

Tulis kodemu di order.rb. main.rb berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

require_relative 'order'

# Kode input/output yang disediakan: biarkan apa adanya
input = []
while (line = gets)
  input << line.chomp
end
puts "free from #{Order::FREE_FROM}"
input.each do |line|
  total, method = line.split
  begin
    puts Order.new(total.to_f, method)
  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