我尝试通过返回一个专门的函数字典来提出一个函数工厂,或多或少像函数式编程风格.我尝试在以下代码中执行此操作.
require(hash)
names = c("aa","bb","cc");
funs = hash()
for (i in seq(length(names))) {
n = names[i]
funs[[n]] = function(x) {
print(paste(n,":",x, sep=""))
}
}
Run Code Online (Sandbox Code Playgroud)
显然,我在数组中有3个函数; 但是,它们的行为与迭代中的最后一个函数相同.
> funs[["aa"]](1)
[1] "cc:1"
> funs[["bb"]](2)
[1] "cc:2"
> funs[["cc"]](3)
[1] "cc:3"
Run Code Online (Sandbox Code Playgroud)
我的猜测是R没有创建新的函数实例,但在for循环中重用了相同的函数对象.
我试着以下希望R会创建不同的函数对象,
funs[[n]] = eval(parse(text="function(x) { print(paste(n,':',x, sep='')) }"))
Run Code Online (Sandbox Code Playgroud)
但它的工作原理与第一个相同.
您是否知道如何创建一个创建不同功能对象的生成器?
我注意到以下代码使用多个线程并在读取文件时保持所有CPU核心忙100%.
scala.io.Source.fromFile("huge_file.txt").toList
Run Code Online (Sandbox Code Playgroud)
我假设以下是相同的
scala.io.Source.fromFile("huge_file.txt").foreach
Run Code Online (Sandbox Code Playgroud)
我在我的开发机器(OS X 10.9.2)上将Eclipse代码作为单元测试中断,并显示这些线程:main,ReaderThread,3 Daemon System Thread. htop如果我在24核服务器机器(ubuntu 12)的scala控制台中运行它,则显示所有线程都忙.
问题:
foreach在多个线程中运行?我的调试器似乎告诉我代码仍然在主线程中运行.任何见解将不胜感激.