Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 为什么工作不正常时会出现这种情况?_Ruby_Case - Fatal编程技术网

Ruby 为什么工作不正常时会出现这种情况?

Ruby 为什么工作不正常时会出现这种情况?,ruby,case,Ruby,Case,我对Ruby不熟悉。if语句运行良好并打印“是”,但case语句工作不正常,并将type设置为10。我是不是对什么东西视而不见?只要案例项目就足够了-不需要案例项目::class Ruby中的大小写匹配是通过模糊匹配(=)算法完成的,该算法不需要这样的特定子句。测试参数是否是self的实例item.class永远不能是任何东西的实例,但特别是,它永远不会是RPG::Armour或RPG::Armour的实例,因此when分支都不会匹配,您将始终获得else分支 顺便说一句:对消息发送使用名称空间

我对Ruby不熟悉。if语句运行良好并打印“是”,但case语句工作不正常,并将type设置为10。我是不是对什么东西视而不见?

只要
案例项目
就足够了-不需要
案例项目::class

Ruby中的大小写匹配是通过模糊匹配(
=
)算法完成的,该算法不需要这样的特定子句。

测试参数是否是
self
的实例
item.class
永远不能是任何东西的实例,但特别是,它永远不会是
RPG::Armour
RPG::Armour
的实例,因此
when
分支都不会匹配,您将始终获得
else
分支

顺便说一句:对消息发送使用名称空间解析操作符
,而不是使用消息发送操作符
,这是非常不习惯的和容易混淆的(并且对于名称以大写字符开头的方法不起作用)。事实上,我相信matz认为将这个特性添加到Ruby是一个错误

还要注意,
case
是一个表达式,事实上,Ruby中的所有内容都是一个表达式

我将按如下方式编写代码:

  if ( item::class == RPG::Weapon )
    print "yup"
  end
  case item::class
  when RPG::Item
    type = 0
  when RPG::Weapon
    type = 1
  when RPG::Armor
    type = 2
  else
    type = 10
  end
然而,一般来说,条件句是一种代码味道。Ruby是一种面向对象的语言,多态性(即基于
self
类型的方法调度)非常重要!事实上,在这个示例中,您正在手动检查
项的类
,以确定其类型,但这正是方法分派所做的!就我个人而言,我希望这段代码是这样的:

type = case item
  when RPG::Item
    0
  when RPG::Weapon
    1
  when RPG::Armor
    2
  else
    10
end

现在,当您添加一种新的游戏对象时,您不必通过向
case
表达式添加新分支来修改现有代码。您只需添加新类,而无需修改任何现有代码。

case
uses===not==对不起,我有点困惑,因为我对一些事情不确定,我刚刚意识到了一些事情。我正在测试的脚本是一个用于名为RPG Maker的游戏引擎的脚本。在引擎中有一个Base_Item脚本,其中有一个名为@class的变量(我刚刚意识到他们使用的是保留字类)。它们是否覆盖了单词class或类似的内容?他们正在将“变量”类设置为“RPG::武器”等。。他们实际上是在改变类的类型,还是仅仅是一个变量?很抱歉问你一些与你无关的问题。顺便说一句,用“item”代替“item::class”很好,但我只是想知道发生了什么。
class RPG::Item
  def type
    0
  end
end

class RPG::Weapon
  def type
    1
  end
end

class RPG::Armor
  def type
    2
  end
end

class RPG::Object # or whatever your baseclass is
  def type
    10
  end
end