有人可以显示如何正确格式化此yield语句,以及为什么我的此yield语句的方法不正确吗?
运行时,编译器将导致“未定义的方法'length'错误。“ Test”是主要类。 def bubble_sort_by(array)
len = array.length - 1
while len > 0
for i in(1..len)
@left = array[i]
@right = array[i - 1]
yield
if @left - @right > 0
array[i - 1], array[i] = array[i], array[i - 1]
end
end
len -= 1
end
p array
end
Test.bubble_sort_by(%w[hi hello hey]) do |left, right|
left.length - right.length
end
答案 0 :(得分:2)
因为您需要传递参数来产生。
尝试将带有yield的行更改为:
compared = yield @left, @right
并处理compared
的结果
答案 1 :(得分:2)
正如我在对该问题的评论中所说,yield
需要传递块变量的值。因此,您的代码需要进行如下修改。
def bubble_sort_by(array)
len = array.length - 1
while len > 0
for i in(1..len)
@left = array[i]
@right = array[i - 1]
if yield(@left, @right) > 0
array[i - 1], array[i] = array[i], array[i - 1]
end
end
len -= 1
end
array
end
bubble_sort_by(%w[hi hello hey]) do |left, right|
left.length - right.length
end
#=> ["hello", "hey", "hi"]
如果在此处屈服于的块具有块变量,则这些变量的值必须作为yield
的参数传递。然后,将返回由该块计算出的值,就像yield
是方法的调用一样。
如果愿意,可以将第一行替换为
def bubble_sort_by(array, &block)
并将if yield(@left, @right) > 0
替换为
if block.call(@left, @right) > 0
此处&
将块转换为Proc
,该变量由变量block
保存。