2014-11-08 1 views
0

Использованиерубин Начинающий: Не удается получить создания методов работы

  • Рубин 2.1.4
  • Mac OSX 10.9.5
  • Text Wrangler
  • Terminal

Работа на Эта проблема: «Создайте класс под названием Car. Дайте ему метод new_car, который вернет пустой массив. (Этот массив символизирует новый автомобиль, который является bein g, построенный на заводе.) Затем создайте метод, который берет пустой массив, возвращаемый методом blank_array, и добавляет некоторую важную часть автомобиля в этот массив и возвращает новый массив. Затем создайте метод, который принимает этот новый массив, и добавит еще что-то еще к нему и т. Д. Сделайте это, пока у вас не будет всего пять методов. Поэтому, к концу, у вас должен быть один метод, который в конечном итоге вернет массив, содержащий четыре части автомобиля. (Например: [«двигатель», «колеса», «радио», «подстаканник»]) «

Итак, я создал класс и бросил туда некоторые методы, чтобы я мог« построить »машину. в IRB и создал переменный с именем newcar написав newcar = Car.new когда я печатаю newcar.new_car рубин возвращает пустой массив Однако, когда я называю любого из других методов, которые я получаю THS сообщения об ошибке:..

NameError: undefined local variable or method автомобиля»для # от автомобиля. гь: 9: в add_wheels' from (irb):5 from /UserName.rvm/rubies/ruby-2.1.4/bin/irb:11:in «`

class Car 

    def new_car 
    car = [] 
    return car 
    end 

    def add_wheels 
    car << "wheels" 
    return car 
    end 

    def add_axels 
    car << "axels" 
    return car 
    end 

    def add_engine 
    car << "engine" 
    return car 
    end 

    def add_radio 
    car << "radio" 
    return car 
    end 
end 

Любая помощь appreci ованные!

ответ

0

Надеюсь, код, который вы написали, предназначен для обучения. Поскольку ни один из его бит не имеет для меня никакого смысла.

Ошибка, которую вы получаете, потому что массив car, который вы определили в методе new_car, является локальным и не будет доступен для других методов экземпляра. Для этого вам нужно использовать attr_accessor сделать car быть доступен как метод экземпляра, который может быть использован для чтения и записи переменной экземпляра, как так:

class Car 

    attr_accessor :car 

    def new_car 
    @car = [] 
    end 

    def add_wheels 
    car << "wheels" 
    return car 
    end 

    def add_axels 
    car << "axels" 
    return car 
    end 

    def add_engine 
    car << "engine" 
    return car 
    end 

    def add_radio 
    car << "radio" 
    return car 
    end 
end 

newcar = Car.new 

newcar.new_car 
puts newcar.add_wheels 
#=> 'wheels' 

Обратите внимание, что в @car = []new_car метода. Это определяет переменную экземпляра @car с пустым массивом, к которому можно получить доступ с помощью метода чтения car и метода записи car<< или car= в коде позже.

Кроме того, иметь ваш переменный экземпляр инициализируется как @car = [], является хорошим местом для initialize метода, не new_car:

def initialize 
    @car = [] 
end 

Так что, когда вы звоните Car.new, он будет вызывать initialize метод и ваша переменная @car = [] будет инициализируется по умолчанию.

+1

Одна вещь. Почему вы используете '@ car' только в' new_car' и аксессуарах везде? Есть ли какая-то конкретная причина? Если да, укажите это в ответе. Если нет - упомяните, что нет =) ... и это может быть хорошим местом для введения 'initialize'. –

+0

@ D-side: Я думаю, что вы не читали примечание внизу, я ясно сказал, почему '@ car' находится в' new_car'. Конечно, было бы неплохо иметь метод инициализации, OP больше обеспокоен тем, почему ошибка является неопределенной локальной переменной метода 'car' в программе. – Surya

+0

Я прочитал его перед тем, как спросить, это довольно сложная часть Ruby. Я думал, что 'attr_accessor' должен был определять методы, которые изменяли соответствующую переменную экземпляра (': car' для '@ car', и это действительно так), а использование' @ car' непосредственно после этого бессмысленно. Я предполагал, что использование только 'car = []' будет работать (вызывается 'car ='), но оказывается, что вместо этого создается локальная переменная. Да. –

-1

Вы пишете методы экземпляра, поэтому вам нужно использовать экземпляр переменной для того, чтобы им всем доступ к тем же массив. Просто замените все свои car переменными @car.

class Car 
    def new_car 
    @car = [] 
    end 

    def add_wheels 
    @car << "wheels" 
    end 
    # etc... 
+0

Первый op не определил какие-либо методы экземпляра, второй, даже если op решает определить переменную экземпляра, вызов 'car <<' не будет работать. В конце вы должны будете создать свой собственный метод записи или использовать attr_writer как минимум. В-третьих, как рубиновый новичок op не поймет, что вы пытаетесь сказать, если не приведете пример, объясняющий вещи. В-четвертых, без примера ответ так же лучше, как комментарий. – Surya

+0

Чтобы быть более ясным, когда я говорю: не определены какие-либо методы экземпляра. Я имел в виду «автомобиль» или «автомобиль <<». – Surya

+0

Во-первых, он определяет методы экземпляра: 'def add_wheels' определяет метод экземпляра и т. Д. Я сказал заменить _every_' car' на '@ car' i.e.' @car <<', что бы сработало. Вы не пытаетесь использовать 'attr_writer' или' attr_accessor' для изменения переменной экземпляра _в классе. Вы можете просто получить доступ к переменной напрямую. – Max

Смежные вопросы