2015-01-16 1 views
-2

내가 식사 플래너 프로그램을 만드는 오전 그것은 나에게 오류를주고 유지는 :루비 정의되지 않은 방법`[] = '1 : Fixnum이라는

main.rb:20:in `update': undefined method `[]=' for 1:Fixnum (NoMethodError) 

이 코드입니다 :

print ("Welcome to the meal planner program") 
def update(aMeal,aCal) 
    print"would u like to change drink or entree" 
    userWant = gets.chomp 
    if userWant =="entree" 
     print("Enter your new meal") 
     newMeal = gets.chomp 
     aMeal [0][0] = newMeal 
     print("Enter the cals") 
     newCal = gets.chomp 
     aCal[0][1] = newCal 
    end 

    if userWant == "drink" 
     print("enter your new drink") 
     newDrink = gets.chomp 
     aMeal[1][0] = newDrink 
     print("Enter the cals :") 
     newCal = gets.chomp 
     aCal[1][1] = newCal 
    end 

end 
def main 
    mondayMeal= [["Fettucine Alfredo",300],[" Drink of Choice!",150]] 
    cals = mondayMeal[0][1] + mondayMeal[1][1] 
    done = false 
    while done == false do 
    puts ("Do you want to 1.view your meals 2.modify your meals") 
    userChoice = gets.chomp 
    if userChoice == "1" 
     print "Your meal is" , mondayMeal[0][0] , "and" , mondayMeal[1][0] 
     print "your calories are" , mondayMeal[0][1] + mondayMeal[1][1] 
    end 

    if userChoice == "2" 
     print "what day?" 
     newDay = gets.chomp 
     if newDay == "monday" 
     update(mondayMeal,cals) 
     end 

    end  

end 


end  
main 
+0

@lurker :'[] '를 사용하여'Integer'로 인덱싱하는 것은 괜찮습니다. 2의 보수 바이너리 표현의 최하위 비트를 리턴 할 것입니다. * Setting *은'[] = '를 사용하는 것이 문제입니다. –

+0

Ruby 코딩 팁으로 코드를 들여 쓰는 데 2 ​​개의 공백을 사용하고 들여 쓰기를 유지하는 데 항문이됩니다. 프로그래밍 실습을 훨씬 쉽게 할 수있는 코딩 연습입니다. 또한 Ruby에서는 camelCase가 아니라 snake_case를 변수 이름으로 사용합니다. CamelCaseIsTooDifficultToRead_snake_case_is_easier. –

+0

@ JörgWMittag 감사합니다. 나는 그 사실을 몰랐습니다. – lurker

답변

0

에 라인 20, aCalaMeal이어야합니다.

+0

OP가'aMeal'을 20 행 이전에 몇 줄로 설정했기 때문에 다른 의도가있는 것처럼 보입니다. – lurker

1

줄 20에서 정수에 대해 [] 메서드를 호출하려고합니다. 루비 인덱스 연산자는 일반적인 방법 일 뿐이므로 구문 오류 대신 다른 언어를 사용하면 런타임시 NoMethodError이 표시됩니다.

update 메소드의 두 번째 인수로 정수인 cals (루비는 정수 Fixnum을 호출 함)을 전달합니다. 그 다음 라인 (20)에 (내가보기 엔 줄 번호가있는 편집기를 사용하는 것이 좋습니다) 당신이

aCal[1][1] = newCal 

을하고있는 것을 볼 수 있습니다 난 당신이 aMeal 대신 aCal를 사용하는 의미가 확실 해요.

분명히 루비를 배우기 시작 했으므로 약간의 제안을 할 것입니다. 배열을 데이터 구조로 사용하는 것은 Ruby 및 Python과 같은 언어에서 많은 초보자가하는 일입니다. 그러나 클래스/객체를 사용하여이를 구현해야합니다. 예를 들어, foodcalories 멤버를 갖는 Meal 클래스가있을 수 있습니다.

+0

사실, Ruby는 배열 지향 배열 및 정수 지향이 아닌 객체 지향적입니다. –

+0

그리고 @ JörgWMittag 이전의 주석에 따르면, 오류는 특별히 'fixnum' 배열에 값에 대한 접근을 할당하려고 시도했기 때문에 발생합니다. Ruby에서는 이러한 값 (예 : *,'2 [1] [1])을 읽는 것이 유효합니다. 과제 (예 : *,'2 [1] [1] = 1')는 아닙니다. – lurker

+0

@lurker 나는 헛소리를하려고하고 있었다. 그러나 그것은 당신이 옳은 것처럼 보인다! 어떤 fixnums의 요점에 응답 : [] 무엇입니까? 항상 0을 반환하는 것 같습니다. – jjm

관련 문제