当前位置: 首页 > 知识库问答 >
问题:

Ruby方法。切换方法

傅胡媚
2023-03-14

只是想知道为什么

def move
  world_switch(@pos_X += 1, @pos_X -= 1, @pos_Y += 1, @pos_Y -= 1)
end

  def world_switch(do_on_north, do_on_south, do_on_east, do_on_west)
    case @facing # => 'NORTH'
    when 'NORTH'
      puts do_on_north # => 1
      do_on_north
    when 'SOUTH'
      do_on_south
    when 'EAST'
      do_on_east
    when 'WEST'
      do_on_west
    end
  end

调用world\u开关:

robot = Robot.new(0, 0, 'NORTH')
robot.move
puts robot.instance_variable_get("@pos_X") #=> 0

结果没有任何变化,我想增加或减少实例变量@pos\u X或@pos\u Y

这是我的初始化方法

def initialize(pos_X, pos_Y, facing)
    @pos_X, @pos_Y, @facing = pos_X, pos_Y, facing
  end

这就是我如何创建类的实例机器人=Robot.new(0,0,'NORTH')

我们将不胜感激

共有3个答案

和柏
2023-03-14

添加到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}>"
卞昀
2023-03-14

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

所以,你用(比如说)、@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根据面向的方式进行切换,并简单地返回相应参数的值。它根本不会更改实例变量。

我不确定我是否解释清楚了。如果你需要澄清,请告诉我。

虞安康
2023-03-14

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

如果是这样,移动需要这样声明

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\u switch中,您可以执行以下操作

case @facing # => 'NORTH'
    when 'NORTH'
      do_on_north.call
    when 'SOUTH'
      do_on_south.call
 ...

 类似资料:
  • 主要内容:语法,实例,从方法返回值,实例,Ruby return 语句,语法,实例,实例,可变数量的参数,实例,类方法,Ruby alias 语句,实例,Ruby undef 语句Ruby 方法与其他编程语言中的函数类似。Ruby 方法用于捆绑一个或多个重复的语句到一个单元中。 方法名应以小写字母开头。如果您以大写字母作为方法名的开头,Ruby 可能会把它当作常量,从而导致不正确地解析调用。 方法应在调用之前定义,否则 Ruby 会产生未定义的方法调用异常。 语法 def method_name

  • 主要内容:CGI 实例化方法,HTML 生成方法,实例,CGI 对象属性以下为CGI类的方法列表: 序号 方法描述 1 CGI::new([ level="query"]) 创建 CGI 对象。query可以是以下值: query: 没有 HTML 生成输出 html3: HTML3.2 html4: HTML4.0 Strict html4Tr: HTML4.0 Transitional html4Fr: HTML4.0 Frameset 2 CGI::escape

  • 本文向大家介绍Ruby Gems更换淘宝源方法,包括了Ruby Gems更换淘宝源方法的使用技巧和注意事项,需要的朋友参考一下 最近由于要做课设,所以昨天装了个 Windows,感觉闲的没事干,就想装个 Ruby 玩玩。 官方的 Rubygems 源由于有些资源放在 Amazon S3 上面,所以有时会抽风,在 Linux 下我用 proxychains gem install xxx 实现了指定

  • 《 笨方法學 Ruby 》(Learn Ruby The Hard Way)是 Zed Shaw 編寫的一本Ruby 入門書籍。適合對電腦了解不多,沒有學過寫程式,但對寫程式感興趣的朋友學習使用。

  • Ruby 提供了一种组织代码并重用的功能,它可以让我们无需创建冗长的 Ruby 代码,在需要它们的时候才会使用它们。对于方法,您只需要学会方法的声明、调用以及传参即可。在本章中会为您详细介绍方法的使用。 1. 声明和调用Ruby方法 在 Ruby 中,我们使用def来声明定义方法,def后面接加方法名,end作为方法的结尾。另外,我们使用方法名()的形式来调用方法,在大多数情况下,我们还可以省略这

  • 问题内容: 我正在构建加速移动页面(AMP)模板,并且想知道是否有一种简便的方法可以切换选项卡上的CSS类。 我知道类似的东西: 但这写的是内联样式-我宁愿切换自定义CSS类,但在AMP页面上找不到示例。 与绑定看起来像是要走的路,但是使用它们给您的工具来操纵状态非常困难… 问题答案: 这可以通过完成。您可以使用隐式状态变量(例如)来跟踪当前状态。这是切换两个类和的示例: