在Scala中,为什么我可以在下面的T m 0(而不是T.m(0))中省略点和大括号?
scala> object T { def m(i:Int) = 0 == i }
defined module T
scala> T m 0
res19: Boolean = true
Run Code Online (Sandbox Code Playgroud)
但为什么我不能n(0)在下面省略这些问题呢?
scala> def n(i:Int) = 0 == i
n: (Int)Boolean
scala> n 0
<console>:1: error: ';' expected but integer literal found.
n 0
^
Run Code Online (Sandbox Code Playgroud) 我很难找到具体的答案,我所知道的是微不足道的.我想了解块如何在Scala中工作.我来自java/ruby背景,似乎scala有一种完全不同的使用块的方式.
以下代码来自Play!框架网站.我想了解Action在语义上是什么.是接受块的对象还是函数,或者两者都不接受.
object Application extends Controller {
def index = Action {
Ok(views.html.index("Your new application is ready."))
}
}
Run Code Online (Sandbox Code Playgroud)
如果它是一个函数,也许它是以下的语法糖(在这种情况下scala如何在幕后传递块):
def index = Action({
Ok(views.html.index("Your new application is ready."))
})
Run Code Online (Sandbox Code Playgroud)
或者它是一些我不知道的scala语法.
对Scala源代码的任何引用都将帮助我理解它在幕后的工作原理.
当我遇到一段对我来说没有意义的代码时,我正在阅读精彩的" Scala编程"一书:
def above(that: Element): Element = {
val this1 = this widen that.width
val that1 = that widen this.width
elem(this1.contents ++ that1.contents)
}
Run Code Online (Sandbox Code Playgroud)
注意第2和第3行:
val this1 = this widen that.width
Run Code Online (Sandbox Code Playgroud)
似乎我应该能够用以下内容替换它:
val this1 = this.widen that.width
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试编译此更改时,它会给出以下错误:
错误:';' 预期,但'.' 找到.
val this1 = this.widen that.width ^
为什么这种语法不可接受?
我正在玩有关Scala in Action book http://www.manning.com/raychaudhuri/的代码示例
引自https://github.com/nraychaudhuri/scalainaction/blob/master/chap01/LoopTill.scala
// Run with >scala LoopTill.scala or
// run with the REPL in chap01/ via
// scala> :load LoopTill.scala
object LoopTillExample extends App {
def loopTill(cond: => Boolean)(body: => Unit): Unit = {
if (cond) {
body
loopTill(cond)(body)
}
}
var i = 10
loopTill (i > 0) {
println(i)
i -= 1
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码cond: => Boolean是我困惑的地方.当我改变cond:() => Boolean它失败了.
有人可以解释一下我之间有什么不同
cond: => Boolean
Run Code Online (Sandbox Code Playgroud)
和
cond:() => Boolean
Run Code Online (Sandbox Code Playgroud)
它们不是都代表功能的参数吗?
下面是Scala Implicit类的示例程序:
object Run {
implicit class IntTimes(x: Int) {
def times [A](f: =>A): Unit = {
def loop(current: Int): Unit =
if(current > 0){
f
loop(current - 1)
}
loop(x)
}
}
}
Run Code Online (Sandbox Code Playgroud)
还有一个类称为" 4 times println("hello")"如下,但我无法理解" 4 times println("hello")"是什么意思?
object Demo {
def main(args: Array[String]) {
4 times println("hello")
}
}
Run Code Online (Sandbox Code Playgroud) 这个简单的教科书REPL有什么问题?
C:\Users\abc>scala
Welcome to Scala version 2.11.1 (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_45).
Type in expressions to have them evaluated.
Type :help for more information.
scala> print "Hello"
<console>:1: error: ';' expected but string literal found.
print "Hello"
^
scala>
Run Code Online (Sandbox Code Playgroud)
这应该打印"你好"
在Scala中,是否可以调用成员方法而无需调用自身的实例?
例如,有这个类:
class Model {
def action(value : String) = {
// Do action
}
}
Run Code Online (Sandbox Code Playgroud)
这个对象实现有效:
object MyModel extends Model {
this action "doSomething"
}
Run Code Online (Sandbox Code Playgroud)
但我想做这样的事情:
object MyModel extends Model {
action "doSomething"
}
Run Code Online (Sandbox Code Playgroud)
与Java属性文件一样,因为它是定义对象状态的一种巧妙方法.
我设法为以下内容定义了一个别名this:
def declare = this
Run Code Online (Sandbox Code Playgroud)
但是在调用成员方法之前必须使用一个单词也是同样的问题.
有没有选择这样做?
我有这个方法:
def myMethod(value:File,x: (a:File) => Unit) = {
// Some processing here
// More processing
x(value)
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以称之为:
myMethod(new File("c:/"),(x:File) => println(x))
Run Code Online (Sandbox Code Playgroud)
有没有办法用支架称它?就像是:
myMethod(new File("c:/"),{ (x:File) =>
if(x.toString.endsWith(".txt")) {
println x
}
})
Run Code Online (Sandbox Code Playgroud)
或者我是否必须用另一种方法编写并将其传递给myMethod?
注意:对一般问题的详细解答是在Stack Overflow问题中,什么是可以省略括号,点,大括号,=(函数)等的精确规则?.
以下作品:
scala> List(1,2,3) filter (_ > 1) reduceLeft(_ + _)
res65: Int = 5
Run Code Online (Sandbox Code Playgroud)
还有以下内容:
scala> List(1,2,3).filter(_ > 1).foldLeft(0)(_ + _)
res67: Int = 5
Run Code Online (Sandbox Code Playgroud)
但不是这个sytax:
scala> List(1,2,3) filter (_ > 1) foldLeft(0)(_ + _)
<console>:10: error: 0 of type Int(0) does not take parameters
List(1,2,3) filter (_ > 1) foldLeft(0)(_ + _)
^
Run Code Online (Sandbox Code Playgroud)
什么是建议的修复?
我在scala语法中遇到了一些我认为是bug/no-syntax-sense的东西,但我更喜欢在报告之后将其发布在此处,因为我可能错了.
控制器类:
package some
import java.awt.event.ActionListener
import java.awt.event.ActionEvent
class ItemController extends ActionListener {
val NEW_ITEM = "new item"
val UPDATE_ITEM = "update item"
private val newItem = new ItemNew
override def actionPerformed(e: ActionEvent) = {
}
def create(view: String) = {
view match {
case NEW_ITEM => {
newItem eraseForm //Here eclipse says "Unit does not take parameters".
newItem setVisible true
}
case UPDATE_ITEM =>
}
}
}
Run Code Online (Sandbox Code Playgroud)
视图类
package some
import scala.collection.mutable.HashMap
import javax.swing.JPanel
import java.awt.GridLayout
import javax.swing.JFrame
import …Run Code Online (Sandbox Code Playgroud) 我发现Option[Map[String, String]]奇怪的作品是这样的:
scala> val fileInfo: Option[Map[String, String]] = Some(Map( "type" -> "hoge" ))
fileInfo: Option[Map[String,String]] = Some(Map(type -> hoge))
scala> fileInfo.get("type")
res1: String = hoge
Run Code Online (Sandbox Code Playgroud)
我认为Option"get"方法不会引起任何争论,所以这对我来说非常奇怪.它为什么有效?它是隐式转换还是错误?我想确定它是如何工作的.
我的规格是:
在Scala doc中,trait Iterator中的Operation具有Subiterators部分.你怎么用它们?
例如,it filter p描述为"迭代器返回it满足条件的所有元素p.
scala> val list1 = List(1,2,3,4,5,6)
list1: List[Int] = List(1, 2, 3, 4, 5, 6)
scala> list1 filter (_ > 3)
res17: List[Int] = List(4, 5, 6)
scala> list1.filter(_ > 3)
res18: List[Int] = List(4, 5, 6)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,您可以使用list.filter(condition)或者list filter (condition) 有人可以提供更多使用这些操作的示例,并解释两种语法格式之间的区别.