对于Python开发者:
Scala的_*
运算符或多或少相当于Python的星号运算符。
示例
将来自链接提供的Scala示例转换为Python,参见Luigi Plinge:
def echo(args: String*) =
for (arg <- args) println(arg)
val arr = Array("What's", "up", "doc?")
echo(arr: _*)
转换成 Python 的代码如下:
def echo(*args):
for arg in args:
print "%s" % arg
arr = ["What's", "up", "doc?"]
echo(*arr)
两者都会输出以下内容:
What's
up
doc?
区别:展开位置参数
虽然Python的*
操作符也可以处理定长函数的位置参数/参数的展开:
def multiply (x, y):
return x * y
operands = (2, 4)
multiply(*operands)
8
用Scala进行相同的操作:
def multiply(x:Int, y:Int) = {
x * y;
}
val operands = (2, 4)
multiply (operands : _*)
将会失败:
方法 multiply 缺少足够的参数: (x: Int, y: Int)Int。
未指定值参数 y。
但是可以用Scala实现相同的功能:
def multiply(x:Int, y:Int) = {
x*y;
}
val operands = (2, 4)
multiply _ tupled operands
根据 Lorrin Nelson 的说法,它是这样工作的:
f _ 是部分应用函数的语法,其中没有指定任何参数。这是获取函数对象的机制。 tupled 返回一个新的函数,它是具有单个元组参数的元数 - 1 函数。
更多阅读:
a: _*
就像 JavaScript 中的展开运算符...a
,其中a
是一个集合。您可以在此处查看展开运算符 -> https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Spread_syntax - Victor