标签: scoping

如何像 itertools 那样使用collect_vec() 来扩展特征?

我想创建一个类似于collect_vec()中的函数的方法itertools

通过复制itertools代码创建一个小示例:

pub trait MyItertools: Iterator {
    fn collect_vec(self) -> Vec<Self::Item>
        where Self: Sized
    {
        self.collect()
    }
}

fn main() {
    let v = (0..5).collect_vec();
    println!("{:?}", v);
}
Run Code Online (Sandbox Code Playgroud)

我天真地期望编译器将在范围内collect_vec按原样 使用我的MyItertools

必须有一些其他的魔法itertools在起作用才能让它编译。

我们得到错误:

pub trait MyItertools: Iterator {
    fn collect_vec(self) -> Vec<Self::Item>
        where Self: Sized
    {
        self.collect()
    }
}

fn main() {
    let v = (0..5).collect_vec();
    println!("{:?}", v);
}
Run Code Online (Sandbox Code Playgroud)

这是误导性的,因为我们确实collect_vecMyItertools.

一种可能的解决方案是针对impl MyItertools所有类型的 Iterator …

generics iterator traits scoping rust

2
推荐指数
1
解决办法
471
查看次数

JavaScript 作用域无法访问 setInterval

嘿伙计们,有人可以快速帮助我吗?

我在一个函数中有一个幻灯片放映间隔,我想在不使用全局作用域的情况下从另一个函数中清除它,因为我知道这是不好的做法。

有人可以帮忙吗?

function beginSlideshow() {
    var interval = setInterval(function () {
      //Slideshow content here
}

function revertSlideshow() {
    clearInterval(interval);
}
Run Code Online (Sandbox Code Playgroud)

javascript scoping

2
推荐指数
1
解决办法
143
查看次数

Python 如何在遇到局部变量的声明之前知道它的存在?

def f(): 
    print("Before", locals())   # line 2
    print(x);                   # line 3
    x = 2                       # line 4
    print("After", locals())    # line 5

x = 1
f()
Run Code Online (Sandbox Code Playgroud)

我知道 Python 中范围界定的 LEGB 规则。

对于上面的代码,当我注释掉第 4 行时,一切都按预期正常执行:对于第 3 行,python 在本地范围内找不到变量x,因此在找到它的全局范围中搜索它并打印 1。

但是当我按原样执行整个代码而不加注释时,它会引发UnboundLocalError: local variable 'x' referenced before assignment.

我确实知道我可以使用非本地和全局,但我的问题是:

  1. python 在遇到局部变量声明之前如何知道存在局部变量声明?
  2. 即使它确实知道本地作用域中有一个名为 x 的变量(尽管尚未初始化),为什么它不在 locals() 中显示它?

我尝试在类似问题建议中找到答案,但失败了。如果我的理解有错误,请指正。

python scoping

2
推荐指数
1
解决办法
104
查看次数

SQL Server中派生表的范围

我最近一直在研究SQL并进行一些探索.关于临时表我发现了3种不同的临时表类型:

1)CREATE TABLE #TempTable

2)DECLARE TABLE @TempTable

3)SELECT*FROM(SELECT*FROM Customers)AS TempTable

现在我理解了#TempTable和@TempTable类型背后的范围,但是如例3中的派生表呢?这个派生表存储在哪里?如果它在1个事务中声明,第二个事务是否可以访问它,或者是与示例1和2相同的派生表的范围?

sql sql-server temp-tables scoping

1
推荐指数
1
解决办法
3016
查看次数

为什么我不能绑定像EMAIL这样的东西!在翻译初创公司的全球背景下?

当我启动R3 Alpha 99会话,并输入此作为第一个命令时,我收到一个错误:

>> is-email-addr: get bind to-word "email?" bind? 'system
** Script error: email? is not in the specified context
** Where: bind
** Near: bind to-word "email?" bind? 'system
Run Code Online (Sandbox Code Playgroud)

但是,如果我退出,重新启动并执行测试以证明email?原始文件存在于system对象之类的全局上下文中,则测试本身使我的别名起作用:

>> equal? bind? 'system bind? 'email?
== true

>> is-email-addr: get bind to-word "email?" bind? 'system
>> is-email-addr fork@example.com
== true
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

reflection rebol scoping

1
推荐指数
1
解决办法
131
查看次数

Javascript变量范围问题

我有一个简单的范围界定问题,这是我的意思.

这是一个更简单的代码版本,但采用相同的原则.

function myFunction(){
  $('.selector_1, .selector_2').click(function(e){
    var $trgt = $(e.target);
    var myVAR;

    if ($trgt.is('.selector_1')){
      myVAR = 'selector_1';
    }

    if ($trgt.is('.selector_2')){
      myVAR = 'selector_2';
    }
    console.log(myVAR);
  }
}
Run Code Online (Sandbox Code Playgroud)

问题是,如果用户selector_1 myVAR每次点击都会成功填充,但是,第二个目标处理程序将始终返回myVAR为undefined.

我假设这是一个编程101类型的东西,但我还没有找到一个直截了当的答案.

谢谢你看看这个!批评公开表示赞赏.

javascript var scoping target

1
推荐指数
1
解决办法
321
查看次数

你应该在for-in循环中创建一个var吗?

for(var key in object){
  //process object[key]
}
Run Code Online (Sandbox Code Playgroud)

要不就

for(key in object) {
  //process object[key]
}
Run Code Online (Sandbox Code Playgroud)

有区别吗?

javascript loops scoping

1
推荐指数
1
解决办法
41
查看次数

Java中的变量范围

在Java中,在使用它之前,您没有物理声明方法.同样的事情不适用于变量.为什么会这样?它只是出于"遗留"的原因(即,Java的创建者不喜欢这样做),还是只是不可能?

例如.,

public class Test
{
    // It is OK for meth1 to invoke meth2
    public void meth1() { meth2(); }
    public void meth2() { }

     // But why is it NOT ok for field1 to reference field2
     private int field1 = field2;
     private int field2 = 3;
}
Run Code Online (Sandbox Code Playgroud)

如果我希望我的Java编译器支持这种前向引用,那么关于如何执行它的一般想法是什么?我知道循环依赖关系存在问题,我们需要谨慎对待.但除此之外,我真的不明白为什么不可能.

[编辑]好的,这是我最初的想法,如何做到这一点.在分析代码时,编译器将为给定范围内的变量构建依赖关系图.如果它看到一个循环(即,int a = b; int b = a),那么它会抛出一个错误.如果没有循环,则必须有一些最佳方式来重新排列语句(在场景后面),这样一个字段只会引用在它之前声明的字段,因此它应该尝试找出顺序.我还没有找到确切的算法,但我认为这是可能的.除非有人能科学地证明我是错的.

回顾一下这个问题: 假设我正在尝试构建自己的Java方言,它支持这种范围.我的主要问题是,你能否就如何做到这一点给我一些想法

谢谢

java scoping

1
推荐指数
1
解决办法
129
查看次数

在Perl中避免全局变量("正确"的方式是什么?)

在编写Perl代码时,我经常遇到这样的情况,即我在文件顶部有一个大型变量集群,它们在脚本中充当"全局"变量.我一直在所有国会大写字母中写下这些"全局"变量,以区别于其他人,但我最近一直在研究一些包含许多模块的非常大的脚本,并且非常希望学习一种最小化"全局"使用的好方法变量并使我的代码尽可能安全.

我经常遇到的情况是有两个共享大量变量的子程序:

my $var1, $var2, $var3, $var4, $var5 . . .
sub sub1 {
    # uses $var1, $var2, $var3 . . .
    # may even make changes to some of these variables
}

sub sub2 {
    # also uses $var1, $var2, $var3 . . .
    # may change $var1, $var2, $var3
}

sub sub3 {
    # doesn't use $var1, $var2, $var3
    # still has access to change them
}
Run Code Online (Sandbox Code Playgroud)

将所有这些变量传递到每个子例程中并返回4或5个变量看起来非常难看并且很快就难以跟踪所有变量,但是如果我将这些变量保持全局,那么我遇到了sub3可能编辑它们的问题它不应该.

我知道我可以使用"{}"对范围变量进行操作,但我个人认为这看起来很丑陋:

{
    my $var1, $var2, $var3, $var4, $var5 . . …
Run Code Online (Sandbox Code Playgroud)

variables perl global-variables code-organization scoping

1
推荐指数
1
解决办法
416
查看次数

在全局命名空间中查找类定义中未绑定的局部变量-这是什么意思?

https://docs.python.org/3/reference/executionmodel.html#resolution-of-names的最后一段说

在名称解析的上下文中,exec()和eval()的类定义块和参数是特殊的。类定义是可以使用和定义名称的可执行语句。这些引用遵循通常的名称解析规则,但在全局命名空间中查找未绑定的局部变量。

引用文字的最后一句是什么意思?起初,我从中推断出将打印以下代码1

a = 1

def foo():
    a = 2
    def bar():
        class Bar:
            b = a
        print(Bar.b)
    bar()

foo()
Run Code Online (Sandbox Code Playgroud)

但我错了-由上面的代码组成的模块,在运行时,会打印出2,即a类定义中的名称,即使它未绑定在类定义块中且未绑定在其外部的本地块中,也是如此。与文档所说的相反,它在全局名称空间中查找。

我尝试了下面描述的另一个代码段(使用一条del语句,该语句是将变量绑定到其中的构造)

a = 1

def foo():
    a = 2
    def bar():
        class Bar:
            del a
        print(Bar.b)
    bar()

foo()
Run Code Online (Sandbox Code Playgroud)

但是del声明提出了NameError: name 'a' is not defined

所以,我不明白,那句话是什么意思?

python scoping

1
推荐指数
1
解决办法
68
查看次数