我理解Ruby和Python的优点。Scala的yield是做什么的?
当前回答
为了理解,考虑以下内容
val A = for (i <- Int.MinValue to Int.MaxValue; if i > 3) yield i
大声读出来可能会有帮助
对于每一个整数i,如果它大于3,那么yield (produce) i并将其添加到列表a中。
在数学集合构建符号方面,上面的for-comprehension类似于
这可以理解为
"对于每一个整数,如果它大于,那么它就是集合中的成员"
或者作为替代
"是所有整数的集合,每个都大于"
其他回答
它用于序列推导式(就像Python的列表推导式和生成器一样,在这里你也可以使用yield)。
它与for结合应用,并将一个新元素写入结果序列。
简单示例(来自scala-lang)
/** Turn command line arguments to uppercase */
object Main {
def main(args: Array[String]) {
val res = for (a <- args) yield a.toUpperCase
println("Arguments: " + res.toString)
}
}
f#中对应的表达式为
[ for a in args -> a.toUpperCase ]
or
from a in args select a.toUpperCase
在Linq中。
Ruby的产量有不同的影响。
为了理解,考虑以下内容
val A = for (i <- Int.MinValue to Int.MaxValue; if i > 3) yield i
大声读出来可能会有帮助
对于每一个整数i,如果它大于3,那么yield (produce) i并将其添加到列表a中。
在数学集合构建符号方面,上面的for-comprehension类似于
这可以理解为
"对于每一个整数,如果它大于,那么它就是集合中的成员"
或者作为替代
"是所有整数的集合,每个都大于"
除非你能从Scala用户那里得到更好的答案(我不是),以下是我的理解。
它仅作为以for开头的表达式的一部分出现,该表达式说明如何从现有列表生成新列表。
喜欢的东西:
var doubled = for (n <- original) yield n * 2
因此,每个输入都有一个输出项(尽管我相信有一种方法可以删除重复项)。
这与yield在其他语言中所支持的“命令式延续”有很大不同,在其他语言中,它提供了一种方法,可以从一些具有几乎任何结构的命令式代码生成任意长度的列表。
(如果你熟悉c#,它更接近LINQ的选择操作符,而不是yield return)。
关键字yield在Scala中只是简单的语法糖,可以很容易地用映射替换,Daniel Sobral已经详细解释过了。
另一方面,如果你在寻找类似于Python中的生成器(或延续),yield绝对会误导你。查看这个SO线程以获得更多信息:在Scala中实现“yield”的首选方式是什么?
val doubledNums = for (n <- nums) yield n * 2
val ucNames = for (name <- names) yield name.capitalize
注意,这两个for表达式都使用了yield关键字:
在for之后使用yield是“秘密武器”,它表示“我想从我在for表达式中迭代的现有集合中生成一个新的集合,使用所示的算法。”
从这里开始
推荐文章
- case对象和对象的区别
- Scala中的Case对象与枚举
- 面向对象编程,函数式编程,过程式编程
- 任务不可序列化:java.io.NotSerializableException,当只对类而不是对象调用闭包外部的函数时
- 在Scala中将一个元素附加到列表的末尾
- 在Scala中按名称调用vs按值调用,需要澄清
- 解析命令行参数的最佳方法?
- Android Scala编程
- 为什么不可变性在JavaScript中如此重要(或需要)?
- lazy val做什么?
- Scala:抽象类型vs泛型
- 如何使用underscore.js作为模板引擎?
- 如何在准引用中使用无形?
- Scala中方法和函数的区别
- Scala中的“提升”是什么?