我试过这个,但它不起作用:
val map:Map[String,String] = for {
tuple2 <- someList
} yield tuple2._1 -> tuple2._2
Run Code Online (Sandbox Code Playgroud)
如何将Tuple2s列表转换为Map?
我正在用Python学习,yield发现这yield不仅是生成器输出返回值的方式,而且是将值放入生成器的方法.例如以下代码
def f():
print (yield),
print 0,
print (yield),
print 1
g = f()
g.send(None)
g.send('x')
g.send('y')
Run Code Online (Sandbox Code Playgroud)
在全球范围内,它send是值'x','y'发电机,因此f它将输出x 0 y 1.但我无法理解
yield秒但3 send秒.为什么要None在第一时间发送?StopIteration最后抛出一个send.有什么方法可以避免这种异常吗?有人可以解释一下吗?提前致谢.
我用一个块调用一个方法;
method do
"Hello"
end
Run Code Online (Sandbox Code Playgroud)
并且该方法被定义为;
def method
yield
end
Run Code Online (Sandbox Code Playgroud)
在定义方法时 ; 我想检查给定的块是否为空(零),因为方法中的变量可能会像这样结束;
method do
""
end
Run Code Online (Sandbox Code Playgroud)
所以在定义中,我想检查yield块是否为nil.喜欢;
def method
if yield ? yield : "Empty block? Seriously?"
end
Run Code Online (Sandbox Code Playgroud)
我知道上面的内容不起作用.这就是我想要实现的目标.
另请记住block_given?将始终为"true",因为即使它是nil或空字符串,也会给出块.
更新:由于大多数意见/答案都表明问题不明确; 这是@ndn简化的问题:
我想检查执行块的结果是否为"空"(nil或"")而不先调用它.
我是新人,对" yield" 有点困惑.但最后我明白它是如何运作的WaitForSeconds
但我看不出" yield return 0"和" yield return null" 之间的区别.
他们都在等待下一帧执行吗?
对不起,我的英语不好.非常感谢你.
正如每个Ruby程序员最终发现的那样,调用包含return语句的块或过程可能会很危险,因为这可能会退出当前的上下文:
def some_method(&_block)
puts 1
yield
# The following line will never be executed in this example
# as the yield is actually a `yield-and-return`.
puts 3
end
def test
some_method do
puts 2
return
end
end
test
# This prints "1\n2\n" instead of "1\n2\n3\n"
Run Code Online (Sandbox Code Playgroud)
如果您希望绝对确定在调用块或proc 之后运行了一些代码,则可以使用begin ... ensure构造.但是,ensure如果在产量期间存在异常,也会调用它,这需要更多的工作.
我创建了一个小模块,以两种不同的方式处理这个问题:
使用safe_yield,检测生成的块或proc是否实际使用return关键字返回.如果是这样,它会引发异常.
unknown_block = proc do
return
end
ReturnSafeYield.safe_yield(unknown_block)
# => Raises a UnexpectedReturnException exception
Run Code Online (Sandbox Code Playgroud)使用 …
根据我的理解,Thread.yield()和Thread.sleep(0)都应该让CPU重新判断某个调度算法运行哪个线程.
不同之处是:
Thread.yield()是给其他线程的执行机会,但Thread.sleep(0)不会,它只会告诉CPU你应该重新安排执行线程,包括当前线程本身.
Thread.yield()只是一个建议,这意味着它可能根本不被接受,但Thread.sleep(0)将强制进行重新排列.
以上两个结论是否正确?
这是" 你可以做很多方面 "的问题之一.请考虑以下代码:
protected virtual IEnumerable<ScriptReference> GetScriptReferences()
{
ScriptReference referece = new ScriptReference();
referece.Assembly = "FeyenoordEnabled";
referece.Name = "FeyenoordEnabled.PassTextBox.js";
return new ScriptReference[] { referece };
}
protected virtual IEnumerable<ScriptReference> GetScriptReferences()
{
ScriptReference referece = new ScriptReference();
referece.Assembly = "FeyenoordEnabled";
referece.Name = "FeyenoordEnabled.PassTextBox.js";
yield return referece;
}
Run Code Online (Sandbox Code Playgroud)
我只需要退回一件物品.第一段代码返回一个包含单个项目的数组,第二段代码生成该项目.什么更好,为什么?
我理解这Thread.currentThread().yield()是对线程调度程序的通知,它可以将cpu周期分配给具有相同优先级的其他线程(如果存在任何此类优先级).我的问题是:如果当前线程已经锁定某些对象和调用yield(),它会立即丢失该锁定吗?并且当线程调度程序发现没有这样的线程来分配cpu周期时,那个已调用的线程yield()将再次处于争夺状态以锁定它先前丢失的对象?
我在javadoc和论坛中找不到它[http://www.coderanch.com/t/226223/java-programmer-SCJP/certification/does-sleep-yield-release-lock]有50-50个答案.
我认为yield()(比如说thread1)应该释放锁定,因为如果某个相同优先级的线程(比如说thread2)想要对同一个对象进行操作,那么当线程调度程序最终将cup分配给thread2时它就有机会.
例如:
int getNext(int n) {
while (TRUE) {
n = n+1;
yield n;
}
}
int main() {
while (TRUE) {
int n = getNext(1);
if (n > 42)
break;
printf("%d\n",n);
}
}
Run Code Online (Sandbox Code Playgroud)
这样上面的代码就会打印出1到42之间的所有数字.我想把yieldgetNext的地址改成后面的指令yield.但我无法弄清楚如何保存上下文(寄存器/变量),因为堆栈将由调用函数运行.
注意:
我意识到上面的代码可以通过静态变量轻松实现,但这不是重点.
我试图在JavaScript和Node.js中了解生成器和产量,但是遇到了问题.
理想情况下,我想要做的是用生成器/ yield包装fs.readFile,这样我就可以同步使用它而不会阻塞任何东西.
我想出了以下代码:
function readFileSync (path) {
return (function *(){
return yield require('fs').readFile(path, function *(err, data){
yield data;
});
})();
}
console.log(readFileSync('test-file.txt'));
Run Code Online (Sandbox Code Playgroud)
但是,不幸的是,readFileSync只是总是返回{}而不是文件内容.
希望我想要实现的目标仍然是可能的,或者我可能完全错过了生成器/产量的点,我完全错误地使用它,在这种情况下指出我出错的地方,任何资源都会很棒.
yield ×10
c# ×2
generator ×2
java ×2
ruby ×2
sleep ×2
.net ×1
c ×1
coroutine ×1
for-loop ×1
ienumerable ×1
ienumerator ×1
immutability ×1
javascript ×1
map ×1
node.js ×1
python ×1
scala ×1