Создание экземпляров по умолчанию и переменных

Итак, у меня есть класс Ball. в Ball у нас есть тип метода. Что я хочу сделать, так это вернуть строку типа мяча. Сложная часть: если у мяча нет аргумента, я хочу вернуть строку «стандарт». Это прекрасно обрабатывает случай без аргументов. Однако случай «футбола» продолжает выдавать ошибку ArgumentError 1 вместо 0. То, что я пытаюсь сделать, это установить значение по умолчанию «стандарт», если нет аргумента, переданного для ввода, и для печати данного аргумента (учитывая, что это строка). Как исправить ArgumentError? Я пробовал использовать splat и уже принимал 0 аргументов. Ни один из них не работал

class Ball
  def type(ball="standard")
      ball
    end
end

Test.assert_equals Ball.new("football").ball_type, "football"
Test.assert_equals Ball.new.ball_type, "standard"

person user3466773    schedule 12.11.2014    source источник


Ответы (1)


Поскольку вы вызываете new для Ball, вы должны переименовать метод type в initialize. Этот метод будет автоматически вызываться при создании нового экземпляра Ball.

class Ball
  def initialize(ball = "standard")
    @ball = ball
  end
end

@ball = ball означает, что аргумент ball сохраняется в переменной экземпляра @ball.

Также похоже, что вам нужен метод для доступа к типу мяча при вызове Ball.new.ball_type:

class Ball
  def initialize ... end

  def ball_type
    @ball
  end
end

Этот метод просто возвращает значение переменной экземпляра @ball, которое было установлено в методе initialize.

После этих модификаций:

Ball.new("football").ball_type # => "football"
Ball.new.ball_type # => "standard"
person August    schedule 12.11.2014
comment
Итак, это помогло, но есть ли способ преломить его? Наличие двух методов для обработки нулевого случая просто кажется мне неэффективным. - person user3466773; 12.11.2014
comment
@user3466773 user3466773 Это настолько просто, насколько это возможно. Вы можете преобразовать def ball_type ... end в attr_accessor :ball, если не возражаете против переименования метода ball_type в ball. - person August; 12.11.2014