2013-04-05 67 views
1

请让我知道这些操作之间有什么区别。第一个代码工作正常:For和Ruby之间的区别

1) for elem in(mr) 
    elem.shedule = Date.new(date.year, date.month, date.day) 
    end 

,但我想用map

2) mr.map!{ |elem| elem.shedule = Date.new(date.year, date.month, date.day) } 

和第二代码返回错误:

NoMethodError in Events#index 

Showing C:/Sites/calend/app/views/events/_calendar.html.erb where line #9 raised: 

undefined method `shedule' for Thu, 04 Apr 2013:Date 

Extracted source (around line #9): 

6: </h2> 
7: <%= calendar_for(@repeats, :year => @date.year, :month => @date.month) do |calendar| %> 
8:  <%= calendar.head('Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday') %> 
9:  <%= calendar.day(:day_method => :shedule) do |date, events| %> 
10:  <%= date.day %> <%= link_to '+', new_event_path(date: date) %> 
11:  <ul> 
12:   <% for event in events %> 

回答

6

你在错误的使用map方式,你应该使用each来代替。 您的代码应该是:

mr.each do |elem| 
    elem.shedule = Date.new(date.year, date.month, date.day) 
end 

map与由块返回的值的数组替换每个元素(见下文Linuxios评论),在您例如块返回Date对象。 map!在不创建新数组的情况下执行相同的操作,因此在您的示例中,mr是一个Date对象数组,而不是Events。

而且使用for是Ruby代码相当罕见,它通常与each,因为更换:

[1, 2, 3].each do |x| 
    puts x 
end 

几乎等同于(看到这个答案的差异姆拉登Jablanović评论):

for x in [1, 2, 3] 
    puts x 
end 

而前者被认为更“鲁比什”。

+1

'for'和'each'的区别在于,'each'接收一个块(因此是一个新的范围),而'for'保留在周围的一个。这意味着,如果在块中引入新的局部变量,在“结束”之后它将不可见。用'for',情况并非如此。 – 2013-04-05 11:30:05

+0

感谢您的指出。 – toro2k 2013-04-05 11:39:15

+0

感谢您的解释! – Gabi 2013-04-05 12:22:59