2

我正在研究“Learn Ruby The Hard Way”,并且有一个关于在对象内部调用方法的问题。我希望有人可以对此有所了解。

代码是:

def play()
  next_room = @start

  while true
    puts "\n--------"
    room = method(next_room)
    next_room = room.call()
  end
end

我知道while这种方法中的循环是使游戏继续进行到不同区域的原因。我的问题是,为什么room.call()必须首先传递给next_room它才能工作?为什么不只是做room.call()让游戏继续到下一个区域?

我自己对此进行了测试,但我不明白为什么它不能以这种方式工作。

4

2 回答 2

4

next_room是一个符号,它命名要调用的方法以确定下一个房间。如果我们查看其中一种房间方法,我们会看到如下内容:

def central_corridor()
  #...
  if action == "shoot!"
    #...
    return :death

因此,如果您从@start = :central_corridorthen in开始playnext_room将会以 as 开始,并且循环:central_corridor的第一个迭代器如下所示:while

room = method(next_room) # Look up the method named central_corridor.
next_room = room.call()  # Call the central_corridor method to find the next room.

假设您选择在room.call()发生时进行拍摄,那么:death最终会在next_room. 然后通过循环的下一次迭代将查找death方法room = method(next_room)并执行它。

method方法用于将符号转换next_room为方法,然后调用该方法以找出接下来会发生什么。接下来发生的部分来自 的返回值room。所以每个房间都由一个方法表示,这些方法返回代表下一个房间的方法的名称。

于 2012-09-11T04:04:39.167 回答
0

这是我创建的一个简单代码。在 print 语句的帮助下,我们能够可视化 method(next_room) 和 room.call() 的作用。

def printThis()
  puts "thisss"
end

next_room = "printThis"
print "next_room is:  ", next_room; puts


room = method(next_room)
print "room is:  ", room; puts

room.call()
于 2014-05-04T01:31:11.277 回答