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