Menu
CoddyTech

İndeksleme ve Ekleme

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

obj[key], [] metodunu; obj[key] = value ise []= metodunu çağırır. Bunları tanımlamak, bir sınıfa dizilerin ve hash'lerin köşeli parantez söz dizimini kazandırır; sınıfa uygun olan her türlü anlamı verebilirsiniz:

class Inventory
  def initialize
    @stock = Hash.new(0)
  end

  def [](name)
    @stock[name]
  end

  def []=(name, qty)
    @stock[name] = qty
  end
end

inv = Inventory.new
inv["apple"] = 5
inv["apple"] += 2
puts inv["apple"]
puts inv["pear"]

Çıktı:

7
0

[] birkaç argüman alabilir; örneğin bir satır ve bir sütun, ayrıca bunları denetleyebilir. Var olmayan bir konum için genellikle IndexError hatası kullanılır:

class Board
  def initialize(size)
    @size = size
    @cells = Array.new(size) { Array.new(size, ".") }
  end

  def [](row, col)
    check(row, col)
    @cells[row][col]
  end

  def []=(row, col, mark)
    check(row, col)
    @cells[row][col] = mark
  end

  def check(row, col)
    raise IndexError, "no cell #{row},#{col}" unless row.between?(0, @size - 1) && col.between?(0, @size - 1)
  end
end

b = Board.new(3)
b[1, 1] = "X"
puts b[1, 1] + b[0, 0]
begin
  b[3, 0]
rescue IndexError => e
  puts e.message
end

Çıktı:

X.
no cell 3,0

<< ekleme operatörüdür. Bu operatörden self döndürmek, dizilerdeki list << a << b gibi zincirleme kullanıma olanak tanır:

class Shelf
  def initialize
    @books = []
  end

  def <<(title)
    @books << title
    self
  end

  def to_s
    @books.join(" | ")
  end
end

shelf = Shelf.new
shelf << "Dune" << "Emma" << "Ulysses"
puts shelf

Çıktı:

Dune | Emma | Ulysses

[]= aracılığıyla yapılan bir atama, herhangi bir ayarlayıcıda olduğu gibi yöntemin döndürdüğü değeri değil, atanan değeri döndürür. Köşeli ayraçlar ve <<, bir sınıfa küçük ve tanıdık bir arayüz kazandırır:

inv["apple"] = 5          # []=("apple", 5) çağrılır, ifadenin değeri 5'tir
inv["apple"]              # []("apple") çağrılır
shelf << "Dune" << "Emma"  # << self döndürür, böylece zincirleme kullanılabilir
board[1, 2] = "X"         # []=(1, 2, "X")
challenge icon

Görev

Kolay

Inventory sınıfını tamamla. inv[name] bir öğenin miktarını döndürür (bilinmiyorsa 0), inv[name] = qty miktarı ayarlar ve inv << name o öğeden bir tane ekleyip envanteri döndürür; böylece çağrılar zincirlenebilir. to_s, adların alfabetik sırasına göre apple: 3, pear: 1 değerini döndürür; miktarı 0 olan öğeleri listeye almaz. Hiç öğe yoksa empty döndürür.

Verilen kod komutları okur: set apple 5, add apple pear pear (her ad için << işlemini zincirler), get apple ve print; ayrıca get ve print sonuçlarını yazdırır.

Kodunu inventory.rb dosyasına yaz. main.rb verilen girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

require_relative 'inventory'

# Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
input = []
while (line = gets)
  input << line.chomp
end
inv = Inventory.new
input.each do |line|
  cmd, *args = line.split
  case cmd
  when "set" then inv[args[0]] = args[1].to_i
  when "add" then args.reduce(inv) { |target, name| target << name }
  when "get" then puts inv[args[0]]
  else puts inv
  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