如何在 Ruby 中使用 &block
How to use &block in 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
好像有重复的代码,想用block或者yield来提高性能,但是不知道怎么办!
这样做:
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
但是不行..有什么帮助吗?
如果您需要处理块参数,您可以使用隐式 yield:
def foo
yield
end
或者您可以显式传递块并使用 block.call
:
调用它
def foo(&block)
block.call
end
因此,如果您将 res << &block
替换为 res << block.call
,则应正确调用块。
在 google 中思考和搜索后,我找到了最好的方法,并了解了如何在 Ruby 中使用 &blocks
和 yields
。
在 bigining 中,我的问题是这个重复的代码:
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
The first thing I do to aboid the repeated code was use a 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
,并将 position_by
中的 yield
替换为 horizontally_position
中括号中的代码(或 vertically_position
). 很抱歉冗余。
完成后我看到了方法 position_by(coord)
并希望对其进行一些重构。
First refactor, using yield
:
def position_by(end_coor)
position[end_coor]..end_coord(end_coor).map do |x|
yield x
end
end
Then use a &block
:
def position_by(coord, &block) # ⁵
(position[coord]..end_coord(coord)).map &block
end
⁵ 这里我们将每个位置映射到一个 & block
,一个块可以是 [ x , position ( 1) ] 或 [position ( 0 ) , y] ,其中 x 或 and 将被替换对应位置[坐标]。
我正在尝试使用 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
好像有重复的代码,想用block或者yield来提高性能,但是不知道怎么办!
这样做:
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
但是不行..有什么帮助吗?
如果您需要处理块参数,您可以使用隐式 yield:
def foo
yield
end
或者您可以显式传递块并使用 block.call
:
def foo(&block)
block.call
end
因此,如果您将 res << &block
替换为 res << block.call
,则应正确调用块。
在 google 中思考和搜索后,我找到了最好的方法,并了解了如何在 Ruby 中使用 &blocks
和 yields
。
在 bigining 中,我的问题是这个重复的代码:
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
The first thing I do to aboid the repeated code was use a
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
,并将 position_by
中的 yield
替换为 horizontally_position
中括号中的代码(或 vertically_position
). 很抱歉冗余。
完成后我看到了方法 position_by(coord)
并希望对其进行一些重构。
First refactor, using
yield
:
def position_by(end_coor)
position[end_coor]..end_coord(end_coor).map do |x|
yield x
end
end
Then use a
&block
:
def position_by(coord, &block) # ⁵
(position[coord]..end_coord(coord)).map &block
end
⁵ 这里我们将每个位置映射到一个 & block
,一个块可以是 [ x , position ( 1) ] 或 [position ( 0 ) , y] ,其中 x 或 and 将被替换对应位置[坐标]。