0

只是想知道为什么

默认移动
  world_switch(@pos_X += 1, @pos_X -= 1, @pos_Y += 1, @pos_Y -= 1)
结尾

  def world_switch(do_on_north,do_on_south,do_on_east,do_on_west)
    案例@面对# =>'北方'
    当'北'
      放 do_on_north # => 1
      do_on_north
    当'南'
      do_on_south
    当'东'
      do_on_east
    当'西'
      do_on_west
    结尾
  结尾

来电world_switch

机器人 = Robot.new(0, 0, 'NORTH')
机器人.move
将 robots.instance_variable_get("@pos_X") #=> 0

结果什么都没有改变,我想增加或减少instance variable @pos_X or @pos_Y

这是我的初始化方法

def 初始化(pos_X,pos_Y,面对)
    @pos_X, @pos_Y, @facing = pos_X, pos_Y, 面对
  结尾

这就是我创建类实例的方式robot = Robot.new(0, 0, 'NORTH')

所有帮助将不胜感激

4

3 回答 3

2

由于您调用的方式,它什么也不做world_switch。Ruby 将在调用之前评估您作为参数传递的每个表达式。

所以,你用(比方说)调用 move,@pos_X两者@pos_Y都等于 0。Ruby 会:

@pos_X += 1 # => @pos_X = 1; param 1 will be 1
@pos_X -= 1 # => @pos_X = 0; param 2 will be 0
@pos_Y += 1 # => @pos_Y = 1; param 3 will be 1
@pos_Y -= 1 # => @pos_Y = 0; param 4 will be 0

world_switch(1, 0, 1, 0)

然后world_switch根据 进行切换@facing,并简单地返回相应参数的值。它根本不会改变实例变量。

我不确定我是否清楚地解释了这一切。如果您需要澄清,请告诉我。

于 2012-09-27T09:46:48.077 回答
2

当前行为的解释如Chowlett所描述的那样,但是您是否打算将您的@pos_X += 1, @pos_X -= 1etc变成代码块,然后根据机器人面对的方式move准确调用其中的一个?world_switch

如果是这样,则需要像这样声明 move

def move
  world_switch(Proc.new { @pos_X += 1 }, Proc.new { @pos_X -= 1 },
    Proc.new { @pos_Y += 1 }, Proc.new { @pos_Y -= 1 })
end

然后world_switch你可以做类似的事情

case @facing # => 'NORTH'
    when 'NORTH'
      do_on_north.call
    when 'SOUTH'
      do_on_south.call
 ...
于 2012-09-27T09:55:48.847 回答
0

添加到 Chowlett 和 mikej 的答案(这很好地解释了为什么您的代码不起作用)。你可以尝试这样的事情:

class Player
  def initialize(position)
    @position = position
  end

  def move(direction)
    case direction
    when :north
      @position[:x] += 1
    when :south
      @position[:x] -= 1
    when :east
      @position[:y] -= 1
    when :west
      @position[:y] += 1
    end
  end
end


player = Player.new({:x => 0, :y => 0})
player.move(:north)
puts player.inspect
# => "#<Player:0x16c7ef8 @position={:x=>1, :y=>0}>"
于 2012-09-27T09:57:42.340 回答