2017-10-27 9 views
-1

私のプログラムには文法上のエラーがあり、本当に気になります。私はルビーを初めて使っているので、それらを修正する方法を理解できないようです。最初のエラーはタイトルにある、私はもう少し私は確信している。プログラムの目的は、メーカー、モデル、年の車を作成し、ユーザーが入力した車の数を入力し、最後にそれらのすべてを表示することです。ruby​​:定義されていないローカル変数またはメソッド 'car' - 構文エラーを修正する

誰かが正しい方向に向かうことができますか?

はここに私のコードです:Rubyで

class Car 

def initialize(make, model, year) 
@make = make 
@model = model 
@year = year 

end 

print "How many cars do you want to create? " 
array_of_cars = Array.new 
num_cars = gets.to_i 

c = car.new 

for i in 1..num_cars 
    end 

puts 
print "Enter make for car #{i}: " 
make = gets.chomp 

print "Enter model for car #{i}: " 
model = gets.chomp 

print "Enter year for car #{i}: " 
year = gets.to_i 

c.set_make(make) 
c.set_model(model) 
c.set_year(year) 

array_of_cars << c 
end 

puts 
puts "You have the following cars: " 

for car in array_of_cars 
    puts "#{car.get_year} #{car.get_make} #{car.get_model}" 
    end 
+2

も、それは他の人私が持っているでしょう –

+0

@PriyankKapadiaを助けるために、あなたの構文エラーメッセージを共有し、私は別のものはより多くの私はそれを修正取得保管してください - 私も「なかったポイントに来ました修正する場所を知っている! –

答えて

1

アドバイスがいくつかあります。 -wオプション付き

実行ルビー:

と警告の原因を排除します。

$ ruby -w cars.rb 
How many cars do you want to create? 2 
cars.rb:2:in `initialize': wrong number of arguments (given 0, expected 3) (ArgumentError) 
    from cars.rb:13:in `new' 
    from cars.rb:13:in `<main>' 

newのでnewinitializeのパラメータとして引数 数を同じにする必要があり、initializeを呼び出します。したがって、すべての情報を尋ねた後でなければ、車を作成することはできません。

クラスで作業しないでください。 Rubyがクラス定義である を読み込むと、あなたのコードが実行されます。この練習では、クラス定義の外のメインレベルに置くか、またはメソッドに配置することができます。

for i in 1..num_cars 
end 

このループは空で何もしません。そして、このC、Perl、Javaスタイル(for、whileなど)の代わりに強力なイテレータを好む。

私はアポストロフィで文字列を定義し、補間が必要なときは二重引用符を保持します(ナノ秒と個人の選択の問題であっても)。 hereおよびthereを参照してください。

Rubyプログラミングに慣れたい場合は、The Pickaxeをお勧めします。

Rubyでさまざまなことができます。以下は1つの解決策です。

class Car 
    attr_reader :make, :model, :year 

    def initialize(make, model, year) 
     @make = make 
     @model = model 
     @year = year 
    end 

    def self.make_car # class method (more precisely : singleton method) 
     print 'How many cars do you want to create? ' 
     array_of_cars = Array.new 
     num_cars = gets.to_i 

     num_cars.times do | i | 
      real_index = i + 1 
      puts 
      print "Enter make for car #{real_index}: " 
      make = gets.chomp 

      print "Enter model for car #{real_index}: " 
      model = gets.chomp 

      print "Enter year for car #{real_index}: " 
      year = gets.to_i 

=begin 
      c = Car.new(make, model, year) 
      array_of_cars << c 
=end 
      # some will tell you to avoid unnecessary variables ... 
      array_of_cars << Car.new(make, model, year) 
     end 

     puts 
     puts 'You have the following cars:' # sorted by year for fun 

     array_of_cars.sort_by{ | car | car.year }.each do | car | 
      puts "#{car.year} #{car.make} #{car.model}" 
     end 
    end 
end # class Car 

Car.make_car 
+0

あなたの説明と役に立つリンクをありがとう!私は私が得ることができるすべての助けを必要とするので、私はそれらを確かにチェックするでしょう! –

+0

シングルトンメソッドは、作成される特定のオブジェクトに対してのみ存在します。それらは異なることができ、クラスの各インスタンスごとに変異することができます。この機能が必要ない場合、シングルトンはインスタンス化するたびにシングルトンメソッドのコピーを作成するので無駄です。 – Tom

+0

@Tom _Aシングルトンメソッドのみが存在する... _右。 _singletonsはコピーを作成するので無駄です_あなたはそれを見つけましたか?私が知る限り、 'alias'と' alias_method'だけがコピーを作成します。インスタンスメソッドのようなシングルトン/クラスメソッドは、インスタンスごとにコピーされません。それらはメソッドリストの一部です。オブジェクトにはクラスへのポインタがあり、メソッドの一意なリストへのポインタを持ちます。 [何を意味するのですか?](https://stackoverflow.com/questions/13706373/what-does-def-self-function-name-mean/13709911#13709911)を参照してください。 – BernardK

3

、クラス名は定数であるので、class Carのように、大文字で開始する必要があります。そのクラスの新しいオブジェクトを作成するときには、クラス自体でnewを呼び出します。したがってcar.newCar.newに変更します。

また、クラス内にset_*get_*のメソッドを定義する必要がありますが、これは一般的なパターンなので、rubyはattr_accessorが利用可能です。 attr_accessorの詳細については、this answerを参照してください。

+0

ああ、あなたはこれで私を完全に悟りました!ありがとうございました! –

2

は、あなたのCar何もしないことを考えてみましょう、それはデータのみが含まれていますし、何のメソッドを持っていません。この場合は、classの代わりにStructにすることを検討してください。 Structは、attr_readerを指定しなくても自動的にリーダーとライターのメソッドを生成します。

Car = Struct.new(:make, :model, :year) 
array_of_cars = Array.new 

while true 
    puts 
    print "Enter make for car ('x' to exit): " 
    make = gets.chomp 
    break if make == 'x' 

    print "Enter model for car: " 
    model = gets.chomp 

    print "Enter year for car: " 
    year = gets.to_i 

    array_of_cars << Car.new(make, model, year) 
end 

puts 
puts 'You have the following cars:' # sorted by year for fun 

array_of_cars.sort_by{ | car | car.year }.each do | car | 
    puts "#{car.year} #{car.make} #{car.model}" 
end 
関連する問題