Tablica jako argument

0

Witam, zaczynam moją przygodę z Ruby i natrafiłem na problem. Za zadanie mam napisanie prostej klasy, której konstruktor może przyjmować 2 argumenty (tablicę i liczbę), 1 argument (tablicę), bądź 0 argumentów.
Próbuję to zrobić, ale coś mi nie wychodzi.
Czy to jest poprawna inicjalizacja?


def initialize(tab={}, max_length)
        @points=tab[:points] || nil
        @max_length= max_length || 10
    end

Czy też może?


def initialize(tab={}, max_length=10)
        @points=tab[:points] || nil
        @max_length= max_length
    end

Czy też obie są złe? Bowiem jak próbuję wywołać:
obj1 = Path.new(:points=>[15,23,32],15)
Otrzymuję:

ruby.rb:21: syntax error, unexpected ')', expecting tASSOC
obj1 = Path.new(:points=>[15,23,32],15)
1

Jest parę błędów. Po pierwsze w Rubym tablice asocjacyjne są nazywane hashami, w przeciwieństwie do zwykłych tablic. Po drugie jeśli używasz symboli jako kluczy w hashu to znacznie lepszy jest tzw. new syntax, czyli { points: [15,…] } jest równoważny { :points => [15,…] }. Ostatnią rzeczą jest to, że argumenty są zamieniane na hash tylko wtedy, gdy jest to ostatni argument na liście, co znaczy, że albo zmienisz definicję initializera na def initialize(size, args = {}) i wywołanie na Path.new(15, points: [15,…]) albo stricte zaznaczysz hash Path.new({ points: [15,…] }, 15).

Dodatkowo oba te zapisy nie są sobie równe, zachowają się inaczej w momencie wywołania konstruktora w postaci Path.new(hash, nil).

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0