【问题标题】:How to pattern match into an uppercase variable?如何将模式匹配成大写变量?
【发布时间】:2012-09-28 21:47:24
【问题描述】:

我在 Scala 中有一个返回元组的方法,假设该方法称为“测试”。那我想做

val (X,Y) = test()

但是,模式匹配仅在 Scala 中当变量名称为小写时才有效,即:

val(_X,_Y) = test(); val X = _X; val Y = _Y

... 工作正常,但丑陋且不简洁。由于 X 和 Y 是矩阵,我真的不想使用小写变量。 (例如在 scipy 和 matlab 中,我不会有这样的限制)。

我认为有一些方法可以确保小写变量的行为类似于大写变量,即通过执行 `x`。也许有一些方法可以使大写变量表现得像小写变量?所以,这就是我的问题:在 Scala 中是否有某种方式可以直接将模式匹配到大写变量中?

【问题讨论】:

    标签: scala programming-languages


    【解决方案1】:

    简短的回答是不要

    语法约定使您的代码对其他人来说可读且易于理解。 Scala 的约定是变量以小写字母开头,常量和类以大写字母开头。违反这一点,不仅会遇到模式匹配问题,而且代码的可读性也会降低。 (相信我,如果你不得不阅读不关心这种约定的其他人编写的代码,你会诅咒那个人。)

    如果你想强调变量是矩阵,我建议你使用xMatrixyMatrix或类似的东西。这将清楚地表明它们是变量并且它们代表矩阵。

    或者创建一个特定于您的项目的约定,所有矩阵变量都将以“M”结尾,例如xMyM

    如果你的代码可读性强,多输入几个字符是值得的。

    【讨论】:

    • 我认为一种语言有点奇怪,它允许您在发现该语言的前 20 小时内使用大写变量名,然后突然变得有点小,但很有用,突然之间决定,不,大写变量,不允许!
    • @HughPerkins 我同意这一点。而且它变得更加混乱:Scala 允许您对常量进行模式匹配,这些常量被定义为具有大写名称的变量。像val MyConst = "Text"; someString match { case MyConst => ...; ... } 这样的东西。这会引起很多混乱。最明智的规则是仅对顶级常量使用大写字母,而在所有其他位置使用小写字母。
    • 好的,好吧,没有人对这个问题提供肯定的答案,所以我现在将你的答案标记为答案,特别是当你为如何解决缺乏问题提供了一些建设性的想法时能够在 Scala 中指定变量的类型(常量与变量)。
    • @HughPerkins 恐怕没有肯定的答案(Kim Stebel 也提到过)——Scala 的模式匹配根据情况确定常量/变量。
    • 我很烦,因为所有 한굴 字符都被 Scala 视为大写。
    【解决方案2】:

    没有办法做到这一点,也不应该这样做。你已经有了变量的类型来告诉你它是一个矩阵,所以没有必要把变量名改成大写。

    【讨论】:

    • 这对于通用软件开发可能是正确的(我不是说它是,但我不会争辩它不是)但我的目标是用于机器学习,其中 X 表示“所有数据点”,x 表示“单个数据点”。这是标准符号,例如参见 Bishop,“模式识别和机器学习”,第 141 页。当然,可以改变一种编码方式以匹配语言,但那里的语言不是让我们的生活更轻松,而不是另一种怎么办? scipy 和 matlab 以及 java 和 c++ 都允许使用 X 作为矩阵的名称。
    • 当然它是数学中的标准符号,就像 x 和 xs 是 scala 中的标准符号一样。但是,这一切都不会改变一个简单的事实,即您想做的事情不会奏效。
    • 真的,我认为变量应该有一个类型来告诉编译器/运行时它是常量还是变量。我不确定使用大写/小写来区分类型在 FP 世界中是否常见,但在 oo 世界中对我来说似乎有点……不寻常……。
    猜你喜欢
    • 2013-06-12
    • 2011-05-27
    • 2013-08-15
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多