Ruby — методы цепочки и возвращаемый массив

У меня есть несколько методов для класса, которые возвращают массивы, такие как ["1", "3", "2", "6", "2"]. Это нормально, что это строковые массивы, а не числовые. У меня есть другой метод, который берет массив и превращает его в одну строку, например 1 3 2 6 2.

class Turn
  def initialize
    @rolls = 1
    @dice = []
  end

  def roll
    @roll = []
    x = 5 - @dice.length
    x.times do |i|
      @roll[i] = rand(6) + 1
    end
    @roll  # ["1", "3", "2", "6", "2"]
  end

  def show
    @dice  # ["1", "3", "6"]
  end

  def line(something)
    temp = ""
    something.each do |x|
      temp << x + " "
    end
    puts temp   # "1 3 6 " or "1 3 2 6 2 "
  end
end

Затем я хочу иметь возможность связывать методы вместе, чтобы я мог делать

first = Turn.new
first.roll.line
first.show.line

Однако я действительно не знаю, как это сделать, и я не смог найти, как это сделать в Интернете. Я видел, как self возвращали, но я не могу понять, что он делает. Код в методе line работает, если я перенесу его в другой метод, поэтому проблема на самом деле просто связана с цепочкой и возвратом.

Если бы кто-то мог помочь не только с кодом, но и с тем, как работает цепочка в отношении возвращаемых значений и как работает возвращение себя, это было бы здорово.

Благодарю вас!


person Paul Hoffer    schedule 05.08.2010    source источник


Ответы (1)


Поскольку ваши методы #roll и #show возвращают массив, вам нужно определить метод Array#line, чтобы действительно иметь возможность выполнять first.roll.line.

Между прочим, уже есть Array#join, который также объединяет элементы массива в строку, как и ваш метод #line, поэтому вы также можете использовать first.roll.join(' ') и избавиться от своего метода #line.

person Zargony    schedule 05.08.2010
comment
Ваша вторая часть идеальна! Спасибо за объяснение первой части. Итак, когда я читаю слева направо, каждый метод возвращает значение, на которое действует следующий метод? - person Paul Hoffer; 05.08.2010
comment
да, каждый метод вернет последний аргумент. отличный способ убедиться в этом — использовать консоль irb. - person Jed Schneider; 05.08.2010
comment
@Jed Вы имеете в виду тот факт, что возвращается последний аргумент в методе, поэтому вам не нужно явно указывать return @dice? Потому что я это уже понимаю. Мне интересно, когда у вас есть несколько методов, связанных вместе, как они передают возвращаемые значения. - person Paul Hoffer; 05.08.2010
comment
Вы можете думать, что first.roll.join(' ') совпадает с tmp = first.roll, за которым следует tmp.join(' '). first — это переменная, содержащая объект (экземпляр класса Turn). first.roll вызывает метод #roll для этого объекта, который возвращает массив (объект, являющийся экземпляром класса Array). В этом массиве вы вызываете метод #join, который возвращает строку (экземпляр класса String). Так что да, если вы цепляете вызовы методов таким образом, каждый шаг вызывает метод экземпляра для возвращаемой вещи предыдущего шага. - person Zargony; 05.08.2010
comment
@Andreas Андреас Спасибо, Андреас, это то, что мне было интересно. Я добавил несколько более сложных цепочек, и все работает отлично. - person Paul Hoffer; 05.08.2010