Scala “班级成员匹配”;错误:未找到:值&&&引用;

Scala “班级成员匹配”;错误:未找到:值&&&引用;,scala,Scala,我正试图从Twitter Scala学校学习Scala,但语法错误让我结结巴巴。当我通过sbt控制台运行“Basics continued”教程中的模式匹配代码时,编译器返回“error:notfound:value&&”。Scala中有什么东西改变了,采用了在编写教程时可能有效但现在不起作用的东西吗?涉及的课程包括 class Calculator(pBrand: String, pModel: String) { /** * A constructor */ val br

我正试图从Twitter Scala学校学习Scala,但语法错误让我结结巴巴。当我通过sbt控制台运行“Basics continued”教程中的模式匹配代码时,编译器返回“error:notfound:value&&”。Scala中有什么东西改变了,采用了在编写教程时可能有效但现在不起作用的东西吗?涉及的课程包括

class Calculator(pBrand: String, pModel: String) {
  /**
   * A constructor
   */
  val brand: String = pBrand
  val model: String = pModel
  val color: String = if (brand.toUpperCase == "TI") {
    "blue"
  } else if (brand.toUpperCase == "HP") {
    "black"
  } else {
    "white"
  }

  // An instance method
  def add(m: Int, n: Int): Int = m + n
}

class ScientificCalculator(pBrand: String, pModel: String) extends Calculator(pBrand: String, pModel: String) {
  def log(m: Double, base: Double) = math.log(m) / math.log(base)
}

class EvenMoreScientificCalculator(pBrand: String, pModel: String) extends ScientificCalculator(pBrand: String, pModel: String) {
  def log(m: Int): Double = log(m, math.exp(1))
}
我的回复看起来像这样

bobk-mbp:Scala_School bobk$ sbt console
[info] Set current project to default-b805b6 (in build file:/Users/bobk/work/_workspace/Scala_School/)
[info] Starting scala interpreter...
[info] 
Welcome to Scala version 2.9.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_17).
Type in expressions to have them evaluated.
Type :help for more information.
...
scala> def calcType(calc: Calculator) = calc match {
     |   case calc.brand == "hp" && calc.model == "20B" => "financial"
     |   case calc.brand == "hp" && calc.model == "48G" => "scientific"
     |   case calc.brand == "hp" && calc.model == "30B" => "business"
     |   case _ => "unknown"
     | }
<console>:9: error: not found: value &&
         case calc.brand == "hp" && calc.model == "20B" => "financial"
                                 ^
<console>:10: error: not found: value &&
         case calc.brand == "hp" && calc.model == "48G" => "scientific"
                                 ^
<console>:11: error: not found: value &&
         case calc.brand == "hp" && calc.model == "30B" => "business"
                                 ^
scala> 
bobk mbp:Scala_学校bobk$sbt控制台
[信息]将当前项目设置为默认值-b805b6(内置文件:/Users/bobk/work/_workspace/Scala_School/)
[信息]正在启动scala解释器。。。
[信息]
欢迎使用Scala版本2.9.2(Java热点(TM)64位服务器虚拟机,Java 1.7.017)。
键入要计算的表达式。
键入:有关详细信息的帮助。
...
scala>def calcType(计算:计算器)=计算匹配{
|案例计算品牌==“hp”和计算模型==“20B”=>“财务”
|案例计算品牌==“hp”和计算模型==“48G”=>“科学”
|案例计算品牌==“hp”和计算模型==“30B”=>“业务”
|案例u=>“未知”
| }
:9:错误:未找到:值&&
案例计算品牌==“hp”和计算模型==“20B”=>“财务”
^
:10:错误:未找到:值&&
案例计算品牌==“hp”和计算模型==“48G”=>“科学”
^
:11:错误:未找到:值&&
案例计算品牌==“hp”和计算模型==“30B”=>“业务”
^
斯卡拉>
当我在对类成员进行匹配时,如何获取和的用例


提前谢谢。我不熟悉这一点。

当您想用模式测试条件时,需要使用:

使用
\uu
表示您不关心
calc
所具有的具体值,而是警卫中提到的一些其他条件

顺便说一句,可以写一个:


但它在您的具体情况下不起作用。

当您想要使用模式测试条件时,则需要使用:

使用
\uu
表示您不关心
calc
所具有的具体值,而是警卫中提到的一些其他条件

顺便说一句,可以写一个:


但它在您的具体案例中不起作用。

如果您是按值匹配的,就像在您的案例中一样,您不仅可以使用防护装置,还可以坚持普通模式匹配:

def calcType(calc: Calculator) = (calc.brand, calc.model)  match {
     case ("hp", "20B") => "financial"
     case ("hp", "48G") => "scientific"
     case ("hp", "30B") => "business"
     case _             => "unknown"
}

我发现这一个更容易解析。

如果您是按值匹配的,就像您的情况一样,您不仅可以使用保护,而且可以坚持使用普通模式匹配:

def calcType(calc: Calculator) = (calc.brand, calc.model)  match {
     case ("hp", "20B") => "financial"
     case ("hp", "48G") => "scientific"
     case ("hp", "30B") => "business"
     case _             => "unknown"
}

我发现这个更容易解析。

顺便说一句,您使用的是过时的Scala版本。当前版本是
2.10.2
。当我强制SBT控制台使用较新版本的Scala时,结果是相同的。是的,当然,但过时的版本是过时的版本…顺便说一句,您使用的是过时的Scala版本。当前版本是
2.10.2
。当我强制SBT控制台使用较新版本的Scala时,结果是一样的。当然,是的,但过时的版本是过时的版本…嗯。那么twitter文档就不能像写的那样工作了?在我从中提取代码的前一节中,它们简要地介绍了“警卫”。看起来这是一个众所周知的问题:就是这样!但是很时髦。对我来说,需要“捕获”这些东西似乎是多余的。不管它编译了,我对“新闪亮”的理解也提高了。那么twitter文档就不能像写的那样工作了?在我从中提取代码的前一节中,它们简要地介绍了“警卫”。看起来这是一个众所周知的问题:就是这样!但是很时髦。对我来说,需要“捕获”这些东西似乎是多余的。不管它编译了,我对“新闪亮”的理解也提高了。这就是我要说的!太糟糕了,我无法撤销正确答案检查,因为我认为这个版本准确地抓住了案例的精神。这里到底发生了什么?你的函数将计算器中的品牌和型号值转换成一个元组,并通过匹配发送给那个孩子?是的,这里发生的是对元组的匹配。此外,如果Calculator是一个case类,您可以编写类似于
calc match{case Calculator(“hp”,“20B”)=>“financial”…
(无耻的插件——实际上您可以撤消)@BobKuhar:撤销正确答案是可能的。只需将不同的答案标记为正确答案…这就是我所说的!太糟糕了,我无法撤销正确答案检查,因为我认为这个版本准确地抓住了案例的精神。这里到底发生了什么?你的函数将计算器中的品牌和型号值转换为元组然后通过匹配发送给那个孩子?是的,这里发生的是对元组的匹配。此外,如果Calculator是一个case类,你可以编写类似于
calc match{case Calculator(“hp”,“20B”)=>“financial”…
(无耻的插件——实际上你可以撤销)@BobKuhar:有可能撤销正确答案。只需将另一个标记为正确答案。。。
def calcType(calc: Calculator) = (calc.brand, calc.model)  match {
     case ("hp", "20B") => "financial"
     case ("hp", "48G") => "scientific"
     case ("hp", "30B") => "business"
     case _             => "unknown"
}