是否存在以不扩展到封闭函数的方式定义范围的语言?换句话说,有一种语言,其中的代码如下(类似Python的语法):
>>> x = 3
>>> def fact(n):
... print x
... return reduce(lambda u, v: u*v, xrange(1, n+1), 1)
...
Run Code Online (Sandbox Code Playgroud)
会产生错误,因为x未在函数内定义fact?
通常,是否存在任何函数的范围不包含其中定义的函数的语言?
编辑:感谢您提供的信息.我之所以想到这一点,是因为内部函数能够访问其包含函数所提供的所有环境的情况听起来非常接近我对Joe Armstrong在他反对OOP的论证中描述的情况:
因为面向对象语言的问题是他们已经拥有了所有这些隐含的环境.你想要一个香蕉,但你得到的是一只拿着香蕉和整个丛林的大猩猩.
另外相关的是,我听说新语言没有全局命名空间,但我不知道它是如何工作的.
我可以想象在下面的Brian的评论中提出的内置函数(从__builtins__Pythonspeak或System中导入的函数在许多其他语言中)的问题是由解释器/编译器在每个函数中人为引入的.毕竟他们几乎总是特别用语言对待.另一种选择是将它们作为对象的方法作为参数传递给函数或从内部作为模块导入.
我正在学习与Akka流一起工作,并且非常喜欢它,但物化部分对我来说仍然有些神秘.
...通过调用池客户端流实现的HostConnectionPool实例上的shutdown()来触发特定池的立即关闭
如何获取HostConnectionPool实例?
更重要的是,我想了解一般如何访问物化值并执行某些操作或从中检索信息.
提前感谢任何文档指针或解释.
很少使用命名的本地类,通常本地类是匿名的.有谁知道为什么下面的代码生成编译器警告?
public class Stuff<E> {
Iterator<E> foo() {
class InIterator implements Iterator<E> {
@Override public boolean hasNext() { return false; }
@Override public E next() { return null; }
@Override public void remove() { }
}
return new InIterator();
}
}
Run Code Online (Sandbox Code Playgroud)
警告就在new InIterator(),它说
[unchecked] unchecked conversion
found : InIterator
required: java.util.Iterator<E>
Run Code Online (Sandbox Code Playgroud)
如果该类不变,是匿名的,或者如果它成为成员,则警告消失.但是,作为一个命名的本地类,它需要声明class InIterator<E> implements ...警告消失.
这是怎么回事?
我正在调试expr1 & expr2其中expr1具有影响expr2评估结果的副作用的代码.我怀疑expr2之前会进行评估expr1,因为JLS保证从左到右的评估&&,但不一定是&.我还怀疑评估顺序的更改可能是HotSpot执行优化的结果(我们正在运行Java 6u20).你知道HotSpot能否进行这样的优化吗?更好的是,提供支持或消除怀疑的文档的任何指针.提前致谢.
编辑:感谢那些建议重写代码,因为它既正确又可读 - 你是对的,但我已经做了,所以这不是我想要的.不幸的是,很难测试这个变化,这就是我在这里提出问题的原因.