没有名称的Scala数组

时间:2018-11-15 11:59:09

标签: arrays scala

这是我可以检查Ruby中的数字是否为偶数/偶数的方法:

def even_or_odd(number)
  ['Even', 'Odd'][number % 2]
end

我在Scala中最接近的是:

  def evenOrOdd(number: Int): String = {
     val a = Array("Even", "Odd")
     a(number % 2)
  }

我真正想做的是这样的,但是不会编译:

  def evenOrOdd(number: Int): String = {
    ("Even", "Odd")(number % 2)
  }

首先,这种“匿名”结构称为什么?其次,什么是优雅的使用方式?如果您有一个类似的示例来说明Scala的功能/简洁/明了,我希望看到它。

3 个答案:

答案 0 :(得分:3)

("Even", "Odd")的类型为(String,String),它是Tuple2[String, String]的别名,它的访问者是._1._2

您可以进行Array("Even", "Odd")(number % 2) 或 编辑:正如评论中指出的那样,这实际上是行不通的。虽然会Array("Even", "Odd").apply(number % 2)

number % 2 match {
    case 0 => "Even"
    case 1 => "Odd"
    case -1 => "Odd" //EDIT: as per comment. I forgot about this case
}

答案 1 :(得分:2)

它将编译:

def evenOrOdd(number: Int): String = {
    Array("Even", "Odd").apply(number % 2)
}

在大多数情况下,可以省去调用apply方法,因为它带有语法糖。但是,在这种情况下,它不起作用。您要么将Array("Even", "Odd")提取到varvardef中,要么必须放弃语法糖。

语法糖Array("Even", "Odd")(number % 2)不起作用的原因在某种程度上难以解释,但这是由于以下原因引起的:

  • Java不允许创建通用数组(例如new T[],其中T是通用类型)
  • Scala允许通过利用ClassTag中的Array.apply创建通用数组; ClassTag带有自己的语法糖,这使得Array("Even", "Odd")(number % 2)无效

答案 2 :(得分:2)

def evenOrOdd(number: Int) = 
 List("Even","Odd")(number % 2)