Menu
Coddy logo textTech

İ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 çağırır ve obj[key] = value []= metodunu çağırır. Bunları tanımlamak, bir sınıfa dizilerin ve hash'lerin köşeli parantez sözdizimini, kendisine uygun herhangi bir anlamla kazandırır:

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ç bağımsız değişken 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. Bundan 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 setter'da olduğu gibi yöntemin döndürdüğü değeri değil, atanan değeri döndürür. Köşeli parantezler ve <<, bir sınıfa küçük ve tanıdık bir arayüz sağlar:

inv["apple"] = 5          # []=("apple", 5) çağırır, ifade 5'tir
inv["apple"]              # []("apple") çağırır
shelf << "Dune" << "Emma"  # << self döndürür, bu yüzden zincirlenir
board[1, 2] = "X"         # []=(1, 2, "X")
challenge icon

Görev

Kolay

Inventory sınıfını tamamla. inv[name] bir öğenin miktarını (bilinmeyen öğeler için 0) döndürür, inv[name] = qty bu miktarı ayarlar ve inv << name o öğeden bir tane ekleyip çağrıların zincirlenebilmesi için envanteri döndürür. to_s, adların alfabetik sırasına göre apple: 3, pear: 1 döndürür; miktarı 0 olan öğeleri dışarıda bırakır veya empty döndürür.

Sağlanan kod şu 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.

Kodun inventory.rb dosyasına yazılmalıdır. main.rb sağlanan giriş/çıkış 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