2013-05-19 118 views
0

我很容易感到與迭代混淆 - 任何人都可以通過這個代碼做什麼? 朋友和家人都是哈希,語言是Ruby。任何人都可以通過這段代碼走過我嗎?

friends.each { |x| puts "#{x}" } 
family.each { |x, y| puts "#{x}: #{y}" } 
+1

你確定'friends'是一個散列而不是一個數組嗎? –

回答

3
  • 散列{a: => :b, :c => :d}被強制轉換爲陣列[[:a, :b], [:c, :d]]each被調用。
  • 如果each上的塊取一個變量x,則傳遞它的每個元素,即第一次迭代時爲[:a, :b],下一次爲[:c, :d]
  • 如果each上的塊取兩個變量xy,則將每個元素如[:a, :b]與變量進行匹配。對於第一次迭代,x變成:a並且y變成:b
4
friends.each { |x| puts "#{x}" } 
family.each { |x, y| puts "#{x}: #{y}" } 

首先是基本上等同於:

x = [friends.keys[0], friends.values[0]] 
puts "#{x}" 
x = [friends.keys[1], friends.values[1]] 
puts "#{x}" 
x = [friends.keys[2], friends.values[2]] 
puts "#{x}" 
# ... 
x = [friends.keys[n], friends.values[n]] 
puts "#{x}" 

第二:

x = family.keys[0] 
y = family.values[0] 
puts "#{x}: #{y}" 
x = family.keys[1] 
y = family.values[1] 
puts "#{x}: #{y}" 
x = family.keys[2] 
y = family.values[2] 
puts "#{x}: #{y}" 
# ... 
x = family.keys[n] 
y = family.values[n] 
puts "#{x}: #{y}" 

您有類似{ |...| ... }do |...|; ...; end的方法之後的任何時間,你所創造的東西被稱爲一個塊。該塊傳遞給該方法,該方法可以將yield參數傳遞給該塊。 Array#each將調用每個元素的塊; Hash#each將通過[key, value]

你可以,當然,這樣做完全不同的東西,比如:

def test 
    yield('oh my') 
    yield('i really') 
    yield('like blocks') 
end 
test { |a| puts a } 

,輸出

oh my 
i really 
like blocks 

如果yield數組塊,它可以被分配給多個或一個參數。

def test 
    yield(['oh', 'my']) 
    yield(['i', 'really']) 
    yield(['like', 'blocks']) 
end 
test { |a, b| puts "#{a}-#{b}" } 

,輸出

oh-my 
i-really 
like-blocks 

或者,如果你只接受塊中的一個參數,它將作爲一個數組

test { |a| puts a.inspect } 

輸出傳遞

["oh", "my"] 
["i", "really"] 
["like", "blocks"] 

因此,比如Array#each不存在,你想自己創建它。你可以這樣做

class Array 
    def each 
    i = 0 
    while i < length_of_underlying_array 
     next_element = get_element(i) 
     yield(next_element) 
    end 
    end 
end 

或者,Hash#each

class Hash 
    def each 
    i = 0 
    while i < length_of_underlying_hash 
     next_key = keys[i] 
     next_value = values[i] 
     yield([next_key, next_value]) 
    end 
    end 
end 

另一個一般小費,因爲Ruby是開源的,你可以看到究竟是如何Array#eachHash#each在C,一般匹配平原實現上面的Ruby代碼。

相關問題