Ruby:NoMethodError:在修改实例变量时未定义方法



我正在编写一个程序,该程序将重新安排公交车上的乘客。我想记录下在公交车上重新安排座位需要多少次洗牌。我以为我有,但我无法更改self.reshuffle_count。如何从方法reshuffle_seating访问@reshufffle_count

class MagicBus < Array
attr_writer :seating
def seating
@seating || []
end
def reshuffle_count
@reshuffle_count || 0
end
def reshuffle_seating
max_passengers = self.seating.max
popular_seat = self.seating.max
pop_seat_indx = self.seating.find_index(popular_seat)
reshuffle_num = 0
self.seating.rotate!(pop_seat_indx)
while popular_seat > 1 do 
self.seating.each_with_index do |seat, index|
if index != 0
self.seating[index] = self.seating[index] +1
popular_seat = popular_seat -1
else
reshuffle_num = reshuffle_num +1
p reshuffle_num
end
end
end
self.seating.rotate!(pop_seat_indx*-1)
self.seating[pop_seat_indx] = popular_seat
self.reshuffle_count = reshuffle_num   
end
end
class TestMagicBusSeating < MiniTest::Test
def test_reshuffle_seating_instance1
bus = MagicBus.new
bus.seating = [0,2,7,0]
bus.reshuffle_seating
assert_equal([2, 4, 1, 2], bus.seating)
assert_equal(5, bus.reshuffle_count)
end
end

错误消息为

Error:
TestMagicBusSeating#test_reshuffle_seating_instance1:
NoMethodError: undefined method `reshuffle_count=' for []:MagicBus
Did you mean?  reshuffle_count
magic_bus.rb:99:in `reshuffle_seating'
magic_bus.rb:217:in `test_reshuffle_seating_instance1'

NoMethodError:未定义的方法`rehunge_count='

这意味着您缺少一个setter。您有getter定义的def reshuffle_count,但没有setter。

class MagicBus < Array
attr_writer :seating
def seating
@seating || []
end
def reshuffle_count=(value)
@reshuffle_count=value
end
def reshuffle_count
@reshuffle_count || 0
end
.....

或者正如@tadman所指出的,attr_writer :resuffle_count

除了接受的答案外,您还可以直接访问同一类的其他方法中的实例变量。

class MagicBus < Array
def reshuffle_count
@reshuffle_count || 0
end
def reshuffle_seating
...
@reshuffle_count = reshuffle_num
end 
end

请注意,如果您定义,attr_writer :resuffle_count,则MagicBus实例也可以读取/写入类之外的变量。

magic_bus = MagicBus.new
magic_bus.resuffle_count # valid

除非您将attr_writer :resuffle_count放在一个私有范围内。

class MagicBus < Array
...
def reshuffle_seating
... 
reshuffle_count = reshuffle_num   
end
private
attr_writer :resuffle_count
end

现在只能在类内部访问resuffle_count

最新更新