2015-10-18 66 views
1

我想在Ruby中使用塊,我有這樣的代碼:如何在Ruby中使用與塊

def positions 
    return horizontally_position if orientation == "horizontally" 
    vertically_position 
    end 

    def horizontally_position 
    res = [] 
    for x in position[0]..end_coord(0) 
     res << [x, position[1]] 
    end 
    return res 
    end 

    def vertically_position 
    res = [] 
    for y in position[1]..end_coord(1) 
     res << [position[0], y] 
    end 
    return res 
    end 

似乎有重複的代碼,並且希望使用一個塊或一個產量提高性能,但不知道如何!

這樣做:

def positions 
    return h_v_position(0, {[x, position[1]]}) if orientation == "horizontally" 
    h_v_position(1, {[position[0], y]}) 
    end 

    def h_v_positions(coord, &block) 
    res = [] 
    for x in position[coord]..end_coord(coord) 
     res << block.call 
    end 
    return res 
    end 

但沒有工作..有沒有幫助?

+0

如果我要解釋這個權利,我覺得強似塊,你只是想通過陣列'[X,位置[1]'或'[位置[0],Y]'。另外,在Ruby中使用塊時,可以像傳遞參數那樣傳遞參數,但在方法內部,您可以使用'block.call'調用塊。但是,塊是塊。它們就是那些用來傳遞特定參數給使用方法的'{stuff in here}'。但是,就你而言,它看起來像是將數組中的信息傳遞給另一個名爲'res'的數組,並將其返回。 –

+0

謝謝你,我找到了解決方案,我會在幾分鐘後發佈。 –

回答

0

經過思考和谷歌搜索後,我找到了最好的方法來做到這一點,並瞭解如何在Ruby中使用&blocksyields

在bigining,我的問題是這樣的repeted代碼:

def horizontally_position 
    res = [] 
    for x in position[0]..end_coord(0) 
     res << [x, position[1]] 
    end 
    return res 
    end 

    def vertically_position 
    res = [] 
    for y in position[1]..end_coord(1) 
     res << [position[0], y] 
    end 
    return res 
    end 

我做的第一件事aboid重複的代碼是使用yield

def position_by(coord) # ² 
    res = [] 
    for n in position[coord]..end_coord(coord) 
     res << yield(n) # ³ 
    end 
    return res 
    end 

    def horizontally_position # ¹ 
    position_by(0) { |n| [n, position[1]] } # ⁴ 
    end 

    def vertically_position # ¹ 
    position_by(1) { |n| [position[0], n] } # ⁴ 
    end 

¹當這個方法會調用,它會調用position_by(1)position_by(0)
²此方法將開始執行,當它涉及到<< yield(n) ...
³它會再來vertically_position「或horizontally_position將取代yieldposition_by在括號中的代碼horizontally_position(或vertically_position)。對不起對於

後冗餘做到這一點,我看到的方法position_by(coord)並希望重構它有點

首先重構,使用yield

def position_by(end_coor) 
    position[end_coor]..end_coord(end_coor).map do |x|  
     yield x 
    end 
    end 

然後用&block

def position_by(coord, &block) # ⁵ 
     (position[coord]..end_coord(coord)).map &block 
    end 

⁵這裏我們映射每個位置到& block和塊可以是[X,位置(1)]或[位置(0),y],其中x或將替換相應的位置[座標]。

1

如果您需要處理塊參數既可以使用隱含收益率:

def foo 
    yield 
end 

,或者你可以明確地傳遞塊,並與block.call稱之爲:

def foo(&block) 
    block.call 
end 

因此,如果您更換res << &blockres << block.call塊應該被正確調用。