2015-10-18 49 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块应该被正确调用。