在scala中,有一些按名称调用的参数:
def hello(who: => String) = println("hello, " + who)
参数的类型是什么who
?
它将 scala REPL 上的函数显示为:
hello: (who: => String)Unit
类型还是=> String
?它有什么名字吗?或者一些描述类型的文档?
提出的进一步问题answer https://stackoverflow.com/a/25409347/342235
问题1
(阅读§3.3.1(方法类型)的规范时)
方法类型是方法的类型,假设我定义了一个方法hello
:
def hello: String = "abc"
它的类型可以写为:=> String
, 正确的?虽然你可以看到 REPL 响应是:
scala> def hello:String = "abc"
hello: String
如果我定义一个有参数的方法:
def goodname(name: String): String = name + "!"
该方法的类型是什么?它应该类似于String => String
, 但不是。因为它是一种方法类型,并且String => String
是一个函数类型。
问题2
(阅读§3.3.1(方法类型)的规范时)
我可以这样理解:
def goodname(name: String): String = name + "!"
def print(f: String => String) = println(f("abc"))
print(goodname)
当我打电话时print(goodname)
,类型goodname
将被转换为函数类型String => String
, right?
但对于无参数方法:
def hello: String = "abc"
可以转换什么函数类型?我试过:
def print(f: () => String) = println(f())
但这无法编译:
print(hello)
错误是:
错误:类型不匹配;
发现:字符串
必需:() => 字符串
你能给我一个有效的例子吗?
问题3
(阅读§6.26.2(方法转换)的规范时)
This 评估仅当类型未应用于参数时才会发生转换。所以,对于代码:
def myname:String = "abc"
def print(name: => String) = println(name)
print(myname)
我的问题是,当我打电话时print(myname)
,是否有转换(我的意思是Evaluation conversion
)发生了?我想,由于类型myname
只是=> String
,因此可以传递给print
直接地。
If the print
方法已更改:
def myname:String = "abc"
def print(name: String) = println(name)
print(myname)
这里的Evaluation conversion
肯定发生过,对吧?(来自=> String
to String
)