Menu
Coddy logo textTech

Sabitler

Coddy'nin Ruby Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 14 / 57.

Sabit büyük harfle başlar ve kural olarak büyük harflerle yazılır. Bir sınıf gövdesinde tanımlandığında, sınıfın her metodunda adıyla kullanılabilir. Sınıfın dışında ClassName::NAME yazarsınız:

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)

Çıktı:

-100
true
false

Sabitler, limitler veya arama tabloları gibi tüm sınıfın kullandığı sabit veriler için uygundur. Bir hash sabitinde fetch, bilinmeyen bir anahtar için sessizce nil döndürmek yerine KeyError hatası oluşturur:

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

Çıktı:

12
key not found: "drone"

Bir sabit adı, Ruby bir uyarı yazdırmadan yeni bir nesneye yönlendirilemez; ancak tuttuğu nesne yine de değiştirilebilir. freeze nesnenin kendisini salt okunur hâle getirir, bu nedenle yapılan bir değişiklik FrozenError hatası oluşturur:

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?

Çıktı:

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

Değere nasıl davrandığına göre seçim yap. Hiçbir zaman değişmeyen bir değer dondurulmuş bir sabite; program çalışırken değişen durum, örneğin bir sayaç, sınıf örnek değişkenine aittir:

class Ticket
  PREFIX = "TK"                  # sabit: bir sabit
  @issued = 0                    # değişir: sınıf örnek değişkeni

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

Görev

Kolay

Order sınıfını tamamla. Sınıf, RATES sabitine (dondurulmuş bir hash: standard 5, express 12, pickup 0 tutarındadır) ve FREE_FROM sabitine (50) sahiptir. initialize(total, method), method RATES için bir anahtar olmadığında ArgumentError hatasını unknown shipping: drone mesajıyla yükseltir. shipping, FREE_FROM değerinden başlayan ve daha yüksek toplamlar için 0, aksi takdirde ücreti döndürür; to_s ise 40.00 + 5 express = 45.00 döndürür.

Sağlanan kod, sabiti kullanarak free from 50 yazdırır; ardından siparişleri total method satırları olarak okur ve her siparişi veya hata mesajını yazdırır.

Kodun order.rb dosyasına yazılmalıdır. main.rb sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

require_relative 'order'

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
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 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