2011-08-17 5 views
0

Ruby를 배우고 있지만 여전히 내 설명서에서 붙여 넣기 복사를하고 있습니다. 그러나 나는 문제에 관해서, 나는 설명 할 방법을 모르고 무엇을 잘못하고 있는지를 모른다.Ruby on Rails 3, 새 객체를 만드는 동안 구문 오류가 발생했습니다.

ruby-1.9.2-p290 :002 > second_page = Page.new :name=>"Second page", :position=>1, :permalink => "second" 
=> #<Page id: nil, subject_id: nil, name: "Second page", permalink: "second", position: 1, visible: false, created_at: nil, updated_at: nil> 

: 나는이 작업을 수행 할 경우,

Loading development environment (Rails 3.0.10) 
ruby-1.9.2-p290 :001 > second_page = Page.new (:name=>"Second page", :position=>1, :permalink => "second") 
SyntaxError: (irb):1: syntax error, unexpected tASSOC, expecting ')' 
...econd_page = Page.new (:name=>"Second page", :position=>1, ... 
...        ^
(irb):1: syntax error, unexpected ',', expecting $end 
...age.new (:name=>"Second page", :position=>1, :permalink => ... 
...        ^
     from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/railties-3.0.10/lib/rails/commands/console.rb:44:in `start' 
     from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/railties-3.0.10/lib/rails/commands/console.rb:8:in `start' 
     from /usr/local/rvm/gems/ruby-1.9.2-p290/gems/railties-3.0.10/lib/rails/commands.rb:23:in `<top (required)>' 
     from script/rails:6:in `require' 
     from script/rails:6:in `<main>' 

하지만 : 내가이 가진 새로운 개체를 만들려면 : 그래서 여기 있습니다

second_page = Page.new (:name=>"Second page", :position=>1, :permalink => "second") 

을하고 난 오류가 발생했습니다 그게 효과가있는 것 같습니다. 설명서에서 예제를 얻었는데 무슨 일이 일어나고 있는지 궁금합니다. 그리고 without()을 사용하지 않으면 객체를 어떻게 처리 할 수 ​​있습니까? 감사합니다.

+0

는 new'와'('사이의 공간을 제거하려고 했나' – rubish

답변

1

Ruby는 둥근 괄호 앞에 공백을 넣을 수 없도록합니다. 이게 작동해야합니다 :

second_page = Page.new(:name=>"Second page", :position=>1, :permalink => "second") 
+0

당신은 내가 다시 쓰기하려고 얼마나 많은 시간을 알고 싶은 해달라고 ... 난 그게 문제였다 생각하지 못할 감사합니다 ... 그리고 다시 ...하지만 나는 이것이 학습이라고 생각합니다. – user899119

+0

그것은 허락합니다. 그러나 그것은 그것을 낙담 시키므로 방출된다. 그러나 실수는 아니며 더 스타일의 문제입니다. –

+0

경고가 아닌 구문 오류입니다. 사실, 모호한 인수가 하나만있을 때 이것이 작동한다는 것을 알지 못했습니다. 하지만 그렇게 할 이유는 없습니다. –

1

당신이 여기 파서는 구문 모호성을 해결하려고합니다. Page.new은 새로 생성 된 활성 레코드 객체에 설정해야하는 속성을 포함하는 해시라는 단일 인수를 허용합니다.

괄호없이 메소드를 호출하면 처음에는 인수가 무엇인지 명확하지 않습니다. 따라서 파서는이 경우 해시이어야 함을 알기에 충분히 똑똑합니다.

실제로 괄호를 쓰는 경우 조금 더 구체적이어야하며 실제로 해시 중괄호도 적어 두어야합니다. 따라서 다음 문은 같습니다.

first_page = Page.new :foo => "Bar" 
second_page = Page.new({:foo => "Bar"}) 
third_page = Page.new ({:foo => "Bar"}) 

대부분의 경우 괄호는 Ruby의 메서드 호출에서 옵션입니다. 그러나 모호함이없는 경우에만. 의심스러운 경우 항상 괄호를 지정하십시오. Ruby 1.9는 여기에서 구문을 변경 했으므로 다소 엄격합니다.

1

메서드에 루비 괄호 안의 인수는 필요하지 않습니다. 마지막 예를 들어 루비다시피

def print_a(*params) 
    puts params.inspect 
end 

print_a "a"         
#prints: ["a"] 

print_a "a", "b"        
#prints: ["a", "b"] 

print_a "a", "b", 2, :four => 4    
#prints: ["a", "b", 2, {:four=>4}] 

print_a "a", "b", 3, :four => 4, :five => 5 
#prints: ["a", "b", 3, {:four=>4, :five=>5}] 

이 해시를 감지하고 키 값 쌍을 집계 똑똑 : 그래서,

object.method() 
# is same as 
object.method 

object.method(param1, param2) 
# is same as 
object.method param1, param2 

매개 변수의 임의의 수를 전달하는 또 다른 인기있는 구문이있다 단일 해시 인수로. 그러나 해시가 마지막 인수 인 경우에만 작동합니다.

print_a("a", "b", :four => 4, :five => 5, 3) 
# gives error: syntax error, unexpected '\n', expecting tASSOC 

# converting the hash to an explicit hash works again 
print_a "a", "b", {:four => 4, :five => 5}, 3 
# ["a", "b", {:four=>4, :five=>5}, 3] 
관련 문제