Ruby is_a? проблемы - PullRequest
1 голос
/ 10 июня 2009

У меня есть конструктор для объектной программы, которая проверяет аргумент, чтобы убедиться, что это целое число:

def initialize(programid,*other_args)
  unless programid.is_a?(Integer) then
    raise TypeError
  end
  @programid = programid
  @name = other_args['name']
end

и когда я создаю новый экземпляр

my_prog = Program::new(13453)

Это дает мне эту ошибку:

can't convert String into Integer (TypeError)

Что не должно происходить, потому что я не пытаюсь сделать преобразование. Есть идеи?

Ответы [ 2 ]

2 голосов
/ 02 ноября 2009

Ошибка не вызвана is_a?

"невозможно преобразовать строку в целое число (TypeError)" вызвано этой строкой:

@name = other_args['name']

other_args - это массив в вашем примере кода, а не хеш - вот почему ruby ​​пытается преобразовать «имя» в целое число (и терпит неудачу)

Если вы вызываете метод с синтаксисом аргумента ключевого слова, он работает так, как если бы все аргументы ключевого слова были объединены в хеш, который передается как последний аргумент вызова метода.

Обратите внимание на разницу в объявлениях методов:

Ваш:

def initialize(programid,*other_args)

Субба Рао

def initialize(*other_args)

Это аккуратное упрощение - превратить все аргументы в один хэш, убрать первый аргумент (который, как предполагает код, у вас есть). Затем укажите пустой хэш по умолчанию в качестве альтернативы, если вы не указали никаких других аргументов:

other_args.first || {}
0 голосов
/ 11 июня 2009
 class Program
  def initialize(*other_args)
    programid   = other_args.shift
    other_args   = other_args.first || {}
    unless programid.is_a?(Integer) then
      raise TypeError
    end
    @programid = programid
    @name = other_args['name']
    puts @name
    puts @programid
  end
end
Program::new(13453)
Program::new(13453,'name'=>"North Wolf")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...