2016-10-03 3 views
0

У меня есть следующий код и он работает, как он должен:Изменение названия этого класса Ruby, вызывает ошибку

class Array 
    def my_name 
    first_name = "Bob" 
    last_name = "Smith" 
    yield(first_name, last_name) 
    end 
end 

['a', 'b', 'c', 'd'].my_name {|i, x| puts "#{i} #{x}"} 

Но в тот момент я изменить имя класса из «массива» к чему-то еще, скажем " Array1 ", появляется следующая ошибка:

`<main>': undefined method `my_name' for ["a", "b", "c", "d"]:Array        (NoMethodError) 

Я не уверен, что эта ошибка означает, но ее нарушение моего кода. Это код не найден.

class Array1 
    def my_name 
    first_name = "Bob" 
    last_name = "Smith" 
    yield(first_name, last_name) 
    end 
end 

['a', 'b', 'c', 'd'].my_name {|i, x| puts "#{i} #{x}"} 

Для жизни меня не может понять, что не так. Я просто пытаюсь понять, как использовать функцию yield для методов внутри класса. У меня действительно проблемы с этим, и если кто-то может мне помочь, это будет очень признательно. Благодаря!

+0

BTW - 'yield' не является функцией, но ключевое слово (то есть тот же статус, как' 'def' или end', не такой же статус, как, например,' puts'). – Amadan

ответ

2

['a', 'b', 'c', 'd'] является экземпляром класса Array (не класса Array1). Чтобы иметь возможность вызывать методы, определенные в классе Array1, вы должны сначала создать экземпляр этого класса.

Array1.new.my_name {|i, x| puts "#{i} #{x}"} 
# Bob Smith 
#=> nil 
+1

Подклассы массивов - плохая, плохая идея. Совсем так, если это делается просто для добавления метода. –

+0

Но я думаю, здесь я смущен. Я поставил два класса, которые я указал ранее в отдельных файлах. Разве они не должны работать индивидуально? Почему ['a', 'b', 'c', 'd'] и экземпляр массива, если Array вообще не существует в моем файле .rb? – John123

+2

@ John123 Array - основной класс. У вас всегда есть доступ к нему и его методам. –

3

По неизвестным причинам вы пытаетесь вызвать вновь введенный метод на экземпляре Array. Просто позвоните туда, где она принадлежит:

Array1.new.my_name { |i, x| puts "#{i} #{x}" } 
Смежные вопросы