2011-08-17 101 views
0

我仍在學習Ruby,並且仍然從我的手冊中複製粘貼。但是我遇到了一個問題,我不知道如何解釋以及我做錯了什麼。所以在這裏,它是: 我要創建這個新的對象:Ruby on Rails 3,創建新對象時出現語法錯誤

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

,我得到了一個錯誤:

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>' 

,但是,如果我這樣做:

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> 

這似乎工作。 我從手冊中得到了一個例子,我想知道發生了什麼? 而沒有()我不知道我該怎麼做的東西與該對象? 謝謝

+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

在方法參數的紅寶石括號中是沒有必要的。所以,

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

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

有傳遞的參數任意數量的另一種流行的語法:

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}] 

正如你可以在最後一個例子紅寶石已經注意到了足夠聰明,檢測散列和聚集鍵值對在一個散列參數中。但它只有在散列是最後一個參數時纔有效。

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] 
相關問題