为什么此代码 return 未定义方法 'length' 用于 nil::NilClass?
Why does this code return undefined method 'length' for nil::NilClass?
我的方法应该接受一个块并将其用于比较排序中的两个元素。它的工作方式如下:
bubble_sort_by(["hi","hello","hey"]) do |left,right|
left.length - right.length
end
# => ["hi", "hey", "hello"]
这是我的方法:
def bubble_sort_by (arr)
i = 1
until i == arr.length
if yield > 0
x = arr[i]
arr[i] = arr[i-1]
arr[i-1] = x
i -= 1
p arr #Check State
else i += 1
p arr #Check state
end
end
arr
end
我不明白为什么它不起作用。当我在不使用块的情况下比较数组的元素时,它会起作用。我只是将基于索引的比较与 yield 交换,以针对一个块修改它。我想它超出了数组的范围并返回了 nil
。有人可以告诉我代码在哪里中断吗?
你得到了 nil 错误,因为 left 和 right 都是 nil。
原因是因为您正在生成一个带有两个参数的块,但您没有通过 yield 语句提供这些参数。
你的假设是错误的,你的错误不是因为数组越界。如果您避免错误,就会发生这种情况。
您收到 undefined method 'length' for nil:NilClass
因为您的函数没有将任何参数传递给 yield
。相反,yield
语句试图评估 nil 参数的块,给你一个来自 left.length
.
的错误
这是我在 运行 你的代码 irb
时得到的:
irb(main):001:0> require './ex.rb'
=> true
irb(main):002:0> bubble_sort_by(["hi","hello","hey"]) do |left,right|
irb(main):003:1* left.length - right.length
irb(main):004:1> end
NoMethodError: undefined method `length' for nil:NilClass
from (irb):3:in `block in irb_binding'
from /Users/amar/Downloads/ex.rb:4:in `bubble_sort_by'
from (irb):2
from /Users/amar/.rubies/ruby-2.2.2/bin/irb:11:in `<main>'
我编辑了你的 if
条件以修复 yield
:
if (yield arr[i-1], arr[i]) > 0
我得到了这个输出,我相信这是你想要的:
irb(main):001:0> require './ex.rb'
=> true
irb(main):002:0> bubble_sort_by(["hi","hello","hey"]) do |left,right|
irb(main):003:1* left.length - right.length
irb(main):004:1> end
["hi", "hello", "hey"]
["hi", "hey", "hello"]
["hi", "hey", "hello"]
["hi", "hey", "hello"]
=> ["hi", "hey", "hello"]
所以,总结一下,记得在使用yield
时传递你的论点。编码愉快!
我的方法应该接受一个块并将其用于比较排序中的两个元素。它的工作方式如下:
bubble_sort_by(["hi","hello","hey"]) do |left,right|
left.length - right.length
end
# => ["hi", "hey", "hello"]
这是我的方法:
def bubble_sort_by (arr)
i = 1
until i == arr.length
if yield > 0
x = arr[i]
arr[i] = arr[i-1]
arr[i-1] = x
i -= 1
p arr #Check State
else i += 1
p arr #Check state
end
end
arr
end
我不明白为什么它不起作用。当我在不使用块的情况下比较数组的元素时,它会起作用。我只是将基于索引的比较与 yield 交换,以针对一个块修改它。我想它超出了数组的范围并返回了 nil
。有人可以告诉我代码在哪里中断吗?
你得到了 nil 错误,因为 left 和 right 都是 nil。
原因是因为您正在生成一个带有两个参数的块,但您没有通过 yield 语句提供这些参数。
你的假设是错误的,你的错误不是因为数组越界。如果您避免错误,就会发生这种情况。
您收到 undefined method 'length' for nil:NilClass
因为您的函数没有将任何参数传递给 yield
。相反,yield
语句试图评估 nil 参数的块,给你一个来自 left.length
.
这是我在 运行 你的代码 irb
时得到的:
irb(main):001:0> require './ex.rb'
=> true
irb(main):002:0> bubble_sort_by(["hi","hello","hey"]) do |left,right|
irb(main):003:1* left.length - right.length
irb(main):004:1> end
NoMethodError: undefined method `length' for nil:NilClass
from (irb):3:in `block in irb_binding'
from /Users/amar/Downloads/ex.rb:4:in `bubble_sort_by'
from (irb):2
from /Users/amar/.rubies/ruby-2.2.2/bin/irb:11:in `<main>'
我编辑了你的 if
条件以修复 yield
:
if (yield arr[i-1], arr[i]) > 0
我得到了这个输出,我相信这是你想要的:
irb(main):001:0> require './ex.rb'
=> true
irb(main):002:0> bubble_sort_by(["hi","hello","hey"]) do |left,right|
irb(main):003:1* left.length - right.length
irb(main):004:1> end
["hi", "hello", "hey"]
["hi", "hey", "hello"]
["hi", "hey", "hello"]
["hi", "hey", "hello"]
=> ["hi", "hey", "hello"]
所以,总结一下,记得在使用yield
时传递你的论点。编码愉快!