我知道Scala支持来自ALGOL的call-by-name,我想我明白这意味着什么,但Scala可以像C#,VB.NET和C++那样通过引用进行调用吗?我知道Java不能通过引用进行调用,但我不确定这种限制是否仅仅是由于语言还是JVM.
当您想要将大量数据结构传递给方法但是您不想复制它时,这将非常有用.在这种情况下,按引用调用似乎是完美的.
我是Scala的新手,我之前从未编写或编译过程序.我正在尝试简单地运行以下Hello World示例,我将其保存在文件名scalaApp.scala中
object scalaApp extends App {
def main(args: Array[String]) {
println("Hello, world!")
}
}
Run Code Online (Sandbox Code Playgroud)
当我在文件目录中的终端并键入"scalac scalaApp.scala"时,我收到以下错误消息:
scalaApp.scala:4: error: overriding method main in trait App of type (args: Array[String])Unit;
method main needs `override' modifier
def main(args: Array[String]) {
^
one error found
Run Code Online (Sandbox Code Playgroud)
我以为我已按照所有指示在我的计算机上正确安装Scala 2.10.3,但我不知道如何测试它,因为我甚至无法编译这个简单的程序.如果我在终端输入"scala",我会得到一个scala提示符,我可以在其上运行"1 + 1"之类的命令.我不确定这表明了多少.我已将SCALA_HOME变量添加到〜/ .profile,并将SCALA_HOME添加到〜/ .profile中的PATH变量中.如果有人能告诉我我做错了什么,或者给我一个关于我可能找到答案的建议,我会很感激.
我的另一个问题是重复的,所以我会再试一次.我也读过这个问题,我问的是不同的.我有兴趣学习内部实现的Call-by-Name: => Type不同之处() => Type.
我的困惑来自于查看javap和cfr反汇编,这两个案例没有区别.
例如ParamTest.scala:
object ParamTest {
def bar(x: Int, y: => Int) : Int = if (x > 0) y else 10
def baz(x: Int, f: () => Int) : Int = if (x > 0) f() else 20
}
Run Code Online (Sandbox Code Playgroud)
javap输出 javap ParamTest.scala:
public final class ParamTest {
public static int baz(int, scala.Function0<java.lang.Object>);
public static int bar(int, scala.Function0<java.lang.Object>);
}
Run Code Online (Sandbox Code Playgroud)
CFR反编译输出 java -jar cfr_0_118.jar …
我理解按名称和按值调用的基本概念,我也研究了一些例子.但是,我不清楚何时使用call-by-name.什么是真实世界的场景,其中call-by-name相对于其他呼叫类型具有显着的优势或性能提升?在设计方法时选择呼叫类型的正确思维方法应该是什么?
在Scala REPL中输入以下小顺序程序及其并行化版本:
/* Activate time measurement in "App" class. Prints [total <X> ms] on exit. */
util.Properties.setProp("scala.time", "true")
/* Define sequential program version. */
object X extends App { for (x <- (1 to 10)) {Thread.sleep(1000);println(x)}}
/* Define parallel program version. Note '.par' selector on Range here. */
object Y extends App { for (y <- (1 to 10).par) {Thread.sleep(1000);println(y)}}
Run Code Online (Sandbox Code Playgroud)
执行X with X.main(Array.empty)给出:
1
2
3
4
5
6
7
8
9
10
[total 10002ms]
Run Code Online (Sandbox Code Playgroud)
而Y与Y.main(Array.empty)给出:
1 …Run Code Online (Sandbox Code Playgroud) 我是scala的新手.我遇到了一个概念,如下所示:
{ val x = a; b.:::(x) }
Run Code Online (Sandbox Code Playgroud)
在这个块中,仍然在b之前评估a,然后将该评估的结果作为操作数传递给b的:::方法
上述声明的含义是什么..
我试过如下:
var a = 10
var b = 20
我应该期待什么结果.
有人可以举个例子......
提前致谢....
我正试图理解"按需召唤"背后的定理.我理解这个定义,但我有点困惑.我想看一个简单的例子,它显示了按需调用的方式.
在阅读了一些以前的线程之后,我发现Haskell使用了这种评估.是否有其他编程语言支持此功能?
我读到了Scala的名字调用,我确实知道按名称调用和按需调用是相似的,但由于需要调用将保持评估值这一事实不同.但我真的很想看到一个真实的例子(它没有必须在Haskell),这表明调用 - 需要.