Scala语法有很多符号.由于使用搜索引擎很难找到这些类型的名称,因此全面列出这些名称会很有帮助.
Scala中的所有符号是什么,它们各自做了什么?
我特别想知道->
,||=
,++=
,<=
,_._
,::
,和:+=
.
在Scala中有一种方法可以使用和任意比较函数对元组数组进行排序吗?特别是我需要通过它们的第二个元素对元组进行排序和数组,但是我想知道一种排序元组数组的通用技术.
谢谢!
在Nutshell中通过C#阅读我注意到了一些我从未遇到过的代码:
_uiSyncContent.Post(_ => txtMessage.Text += "Test");
Run Code Online (Sandbox Code Playgroud)
什么是下划线后跟箭头?我已经看到Lambda表达式以类似的方式编写,但没有任何下划线.
我已经从许多其他语言中接受了下划线与标识符中的字母表一样多的自由度.因此_v
和v_
.此外,建议使用尾随下划线以避免使用保留关键字(class_
,case_
)模糊不清.
val abc_=0
<console>:1: error: '=' expected but integer literal found.
val abc_=0
Run Code Online (Sandbox Code Playgroud)
下划线是Scala打字系统的重要组成部分,在标识符中使用它们的推荐方法是什么,这样解析器和人类都可以满意?带下划线的标识符带来的所有可能的歧义是什么?
领先的空白似乎增加了混乱_class
而不是class_
.
相关问题:
我读了一个项目的源代码,发现:
val sampleMBR = inputMBR.map(_._2).sample
Run Code Online (Sandbox Code Playgroud)
inputMBR
是一个元组.
该函数map
的定义是:
map[U classTag](f:T=>U):RDD[U]
Run Code Online (Sandbox Code Playgroud)
这似乎map(_._2)
是速记map(x => (x._2))
.
谁能告诉我那些速记的规则?
为什么许多人说使用下划线是Scala中的好习惯并使您的代码更具可读性?他们说动机来自形式语言理论.然而,许多程序员,特别是来自其他语言的程序员,尤其是那些具有匿名功能的程序员,更喜欢不使用下划线,尤其是占位符.
那么下划线的重点是什么?为什么Scala(和om-nom-nom指出的其他一些函数式语言)有下划线?在复杂性和语言理论方面,正式基础是什么,为什么它通常使用它的好风格?
根据这个答案/sf/answers/560074581/我们可以在Scala中执行此操作:
val _ = 5
Run Code Online (Sandbox Code Playgroud)
现在我理解了lambda表达式中被忽略的参数的意义,但是我无法想象我想要声明一个根据定义我无法引用的变量的例子.我能想到的唯一例子是关于命名隐式值的懒惰,例如
implicit val _: MyNumeric = ...
...
class A[T : MyNumeric] {
...
Run Code Online (Sandbox Code Playgroud)
这是唯一的用例吗?我错过了什么吗?
如果它是唯一使用的情况下,不应该编译器/ IDE给予警告/提示时,val
是不是隐含的,因为它是毫无意义?
澄清
通过变量/值我的意思是单个,而不是提取声明的一部分.
给定一个元组类型的元组A
和另一个参数化的类型A
:
trait Writer[-A] { def write(a: A): Unit }
case class Write[A](value: A, writer: Writer[A])
Run Code Online (Sandbox Code Playgroud)
和使用网站:
trait Cache { def store[A](value: A, writer: Writer[A]): Unit }
Run Code Online (Sandbox Code Playgroud)
为什么以下使用元组的提取器按预期工作:
def test1(set: Set[Write[_]], cache: Cache): Unit =
set.foreach {
case Write(value, writer) => cache.store(value, writer)
}
Run Code Online (Sandbox Code Playgroud)
但是以下失败了:
def test2(set: Set[Write[_]], cache: Cache ): Unit =
set.foreach { write =>
cache.store(write.value, write.writer)
}
Run Code Online (Sandbox Code Playgroud)
有错误消息
found : Writer[_$1] where type _$1
required: Writer[Any]
cache.store(write.value, write.writer)
^
Run Code Online (Sandbox Code Playgroud)
我可以修复第二个form(test2
)来正确编译吗?
编辑
离开Owen的想法我试过,如果我可以使其工作没有模式匹配(这是我想要的第一个).这是两个更奇怪的情况,一个工作,另一个不工作: …
这些代码中这些下划线用法之间有什么区别和术语名称:(参见handler(resource)
部分)
1.
def readFile[T](f: File)(handler: FileInputStream => Byte => T): T = {
val resource = new java.io.FileInputStream(f)
try {
val hh = handler(resource)_
hh(2)
} finally {
resource.close()
}
}
val bs = new Array[Byte](4)
readFile(new File("scala.txt")) {
input => b: Byte => println("Read: " + (input.read(bs) + b))
}
Run Code Online (Sandbox Code Playgroud)
我收到编译错误:
Error:(55, 29) _ must follow method; cannot follow Byte => T
val hh = handler(resource)_
^
Run Code Online (Sandbox Code Playgroud)
这是什么意思?
2.
def readFile[T](f: File)(handler: FileInputStream => Byte => T): …
Run Code Online (Sandbox Code Playgroud) 大家好,我正在尝试理解scala中的符号"_",它看起来像一个通配符,但我不明白为什么在给定的场景中.
var l = List("a","b" ,"c")
// Works "s" works as a variable.
l.foreach( s =>
if(s=="a"){
print(s)
}
)
// Works _ takes the place of "s"
l.foreach(
print(_)
)
//So the doubt is whether "_" is a wildcard that does not work well.
l.foreach(
if(_=="a"){
print(_)
}
)
Run Code Online (Sandbox Code Playgroud)
"_"应该像变量一样s
,但为什么不呢?