这是我可以检查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的功能/简洁/明了,我希望看到它。
答案 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")
提取到var
,var
或def
中,要么必须放弃语法糖。
语法糖Array("Even", "Odd")(number % 2)
不起作用的原因在某种程度上难以解释,但这是由于以下原因引起的:
new T[]
,其中T
是通用类型)ClassTag
中的Array.apply
创建通用数组; ClassTag
带有自己的语法糖,这使得Array("Even", "Odd")(number % 2)
无效答案 2 :(得分:2)
def evenOrOdd(number: Int) =
List("Even","Odd")(number % 2)