标签: scoping

我可以使用块来管理C++中的变量范围吗?

我试图在C++程序中节省一些内存,我想知道我是否可以使用块作为变量的范围(如Perl).假设我有一个巨大的对象执行一些计算并给出结果,这样做是否有意义:

InputType  input;
ResultType result;

{
    // Block of code
    MyHugeObject mho;
    result = mho.superHeavyProcessing();
}

/*
   My other code ...
*/
Run Code Online (Sandbox Code Playgroud)

退出块时,我可以期望对象被销毁吗?

c++ object scoping

5
推荐指数
2
解决办法
799
查看次数

为什么我的Perl子例程不能在调用它的foreach循环中看到变量的值?

我希望这是直截了当的,我做错了.我在网上看到一些关于"变异自杀"看起来不错的东西,但它是旧版本而且我在5.10.1.

无论如何 - 我声明的变量 - $ RootDirectory - 只是突然失去了价值,我无法弄清楚原因.

这是一个重现问题的脚本.当我在调试模式(perl -d)中运行脚本时,我可以在第21行和第26行打印出$ RootDirectory.但它已经过了第30行.

use strict;
my $RootDirectory; 
my @RootDirectories; 

@RootDirectories = (
   'c:\\P4\\EDW\\PRODEDW\\EDWDM\\main\\db\\'
   ,'c:\\P4\\EDW\\PRODEDW\\EDWADS\\main\\db\\'
   ,'c:\\P4\\EDW\\PRODEDW\\FJE\\main\\db\\'
   );

foreach $RootDirectory (@RootDirectories) { 
   # $RootDirectory = 'c:\\P4\\EDW\\PRODEDW\\EDWDM\\main\\db\\';
   # print ' In foreach ' . $RootDirectory. "\n";
   RunSchema ();
} 

exit(0);

sub RunSchema() { 
   # print ' In RunSchema ' . $RootDirectory. "\n";
   CreateTables ();
} 

sub CreateTables() { 
   # print ' In CreateTables ' . $RootDirectory. "\n";
   SQLExecFolder ('tbl');
} 

sub SQLExecFolder() { 
   print …
Run Code Online (Sandbox Code Playgroud)

perl foreach scoping

5
推荐指数
3
解决办法
5242
查看次数

在函数中使用sfApply时的范围问题(包降雪 - R)

让我在R中添加另一个范围问题,这次是降雪包.如果我在我的全局环境中定义一个函数,并且我稍后在另一个函数中的sfApply()中尝试使用该函数,则不再找到我的第一个函数:

#Runnable code. Don't forget to stop the cluster with sfStop()
require(snowfall)
sfInit(parallel=TRUE,cpus=3)

func1 <- function(x){
    y <- x+1
    y
}

func2 <- function(x){
    y <- sfApply(x,2,function(i) func1(i) )
    y
}

y <- matrix(1:10,ncol=2)
func2(y)
sfStop()
Run Code Online (Sandbox Code Playgroud)

这给出了:

> func2(y)
Error in checkForRemoteErrors(val) : 
  2 nodes produced errors; first error: could not find function "func1"
Run Code Online (Sandbox Code Playgroud)

如果我将我的函数嵌套在另一个函数中,它可以工作.当我在全局环境中使用sfApply()时,它也可以工作.事实是,我不想在函数2中嵌入我的函数func1,因为这会导致func1被定义多次(func2用于循环结构).

我已经尝试过简化代码以摆脱双循环,但由于问题的性质,这是不可能的.有任何想法吗?

r function scoping

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

点 - 点参数的范围

我对dot-dot-dot参数的范围有疑问.考虑以下函数`foo =

foo <- function(x, ...){
   require(classInt);
   intvl = classIntervals(x, ...);
   return(intvl);
 }
Run Code Online (Sandbox Code Playgroud)

该功能适用​​于以下调用

x = runif(100, 0, 100);
y1 = foo(x, n = 5, style = 'quantile');
y2 = foo(x, style = 'equal');
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用style ='fixed'参数时,我需要一个fixedBreaks参数

y3 = foo(x, style = 'fixed', fixedBreaks = seq(0, 100, 20))
Run Code Online (Sandbox Code Playgroud)

eval中的错误(expr,envir,enclos):...列表不包含2个元素

请注意,以下工作完美

y5 = classIntervals(x, style = 'fixed', fixedBreaks = seq(0, 100, 20))
Run Code Online (Sandbox Code Playgroud)

我怀疑这与范围规则有关,但一直无法指责它.任何有关这方面的帮助将非常感谢.

编辑.我拼凑了一个更简单的黑客,使它工作.我认为这是一个match.call问题,因为style ='pretty'存在同样的问题.快速查看代码显示这些是match.calls的两种样式,所以很可能这是错误的来源.无论如何,这是我提出的黑客攻击

foo2 <- function(x, ...){
  require(classInt);
  y = list(...); y$var = x;
  intvl = do.call('classIntervals', y);
}

y6 …
Run Code Online (Sandbox Code Playgroud)

r scoping

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

javascript:如何在函数本身中引用匿名函数?

如果在"use strict"中不允许arguments.callee,我们就做不到

var f = function g() {
    //g
}
Run Code Online (Sandbox Code Playgroud)

因为在IE中不起作用(或者说"奇怪")http://kangax.github.com/nfe/#jscript-bugs,那么我们还有哪些其他选项可以引用函数中的匿名函数本身?

javascript function anonymous-function scoping

5
推荐指数
2
解决办法
3436
查看次数

方案范围(定义和让)

所以我知道在Scheme中定义的是动态作用域,并且允许静态作用域,但是下面的内容让我困惑:

如果我有

(let ((x 0))
  (define f (lambda () x))
  (display (f))
  (let ((x 1))
    (display (f))
    )
  )
Run Code Online (Sandbox Code Playgroud)

它将显示00.到目前为止一切顺利.但是,如果我为x添加额外的定义,如下所示:

(let ((x 0))
  (define f (lambda () x))
  (display (f))
  (define x 4)
  (let ((x 1))
    (display (f))
    )
  )
Run Code Online (Sandbox Code Playgroud)

它将显示undefined4.为什么是这样?为什么评估f 之后定义x 会影响(f)的返回值?为什么返回值"未定义"?

还值得一提的是,用letrec而不是define绑定f也会起作用:

(let ((x 0))
  (letrec ((f (lambda () x)))
  (display (f))
  (define x 4)
  (let ((x 1))
    (display (f))
    )
  )
)
Run Code Online (Sandbox Code Playgroud)

返回00.

注意:我使用了DrRacket,上面写着"Pretty Big"

scheme scoping racket

5
推荐指数
2
解决办法
932
查看次数

验证R中函数内的对象是否存在

我想确定一个对象是否存在于R中的函数内:

foo <- function() {
 y <- "hello" 
 if (exists(y, envir = sys.frame())) print(y)
}
foo()
Run Code Online (Sandbox Code Playgroud)

存在错误(y,envir = sys.frame()):第一个参数无效

我想添加envir = sys.frame()就可以了.也试过了envir = environment()

预期

foo()
"hello"
Run Code Online (Sandbox Code Playgroud)

environment r scoping

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

Scala - 在另一个范围内提供隐式值类

我有一个foo包含类的包FStream.package对象foo定义了一些提供扩展器方法的隐式值类FStream.我想将这些值类从包对象中移出并放入它们自己的单独文件中,但我也希望它们在我使用时始终可用FStream(或者最好是当我使用foo包中的任何东西时.是否可以实现这一点?我尝试将隐式值类放入其他对象中,但我无法从对象扩展.尝试将它们放在类或特征中,但隐式值类只能在其他对象中定义.

富/ FStream.scala

package foo

class FStream {
  def makeFoo(): Unit = ???
}
Run Code Online (Sandbox Code Playgroud)

富/ package.scala

package foo

package object foo {

  // I want to move these definitions into separate files:

  implicit class SuperFoo(val stream: FStream) extends AnyVal {
    def makeSuperFoo(): Unit = ???
  }

  implicit class HyperFoo(val stream: FStream) extends AnyVal {
    def makeHyperFoo(): Unit = ???
  }
} 
Run Code Online (Sandbox Code Playgroud)

酒吧/ usage.scala

package bar

import foo._ // …
Run Code Online (Sandbox Code Playgroud)

scala scoping implicit-conversion

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

从项目中的两个单独的脚本访问库中的类实例

我进行了全面搜索,无法提出合理的搜索查询来产生有用的结果。我将尝试通过一个简单的示例(已测试)对此进行解释。

假设我有一些小的自定义Python库,其中仅包含以下私有类和公共实例:

#!/usr/bin/env python

class _MyClass(object):
    def __init__(self):
        self.val = "Default"

my_instance = _MyClass()
Run Code Online (Sandbox Code Playgroud)

现在,我还有另外两个python文件(“ file_a”和“ file_b”),最终将从我的库中导入此实例,如下所示。

“ file_a”中的完整代码:

#!/usr/bin/env python

from my_lib import my_instance

my_instance.val = "File A was here!"
import file_b
file_b.check_val()
Run Code Online (Sandbox Code Playgroud)

“ file_b”中的完整代码:

#!/usr/bin/env python

from my_lib import my_instance

def check_val():
    print "From 'file_b', my_instance.val is: {}".format(my_instance.val)
Run Code Online (Sandbox Code Playgroud)

如果仅在还包含“ file_b”和“ my_lib”的目录中执行“ file_a”,则结果输出为:

#!/usr/bin/env python

class _MyClass(object):
    def __init__(self):
        self.val = "Default"

my_instance = _MyClass()
Run Code Online (Sandbox Code Playgroud)

有人可以在我的示例中向我解释'file_b'如何访问与'file_a'相同的实例吗?这与'file_a'中设置的值是全局值有关吗?

顺便说一句,我确实知道我可以再次公开“ MyClass”,并在“ file_a”或“ file_b”中需要唯一实例时将其实例化,但是我发布此问题的主要原因是为了解决问题这个特定的概念。

python import scoping

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

update()不适用于通过lapply()创建的模型

我想用lapply()R来计算几个模型,但似乎该update()函数无法处理通过生成的模型lapply().

一个最小的例子:

d1 <- data.frame(y = log(1:9), x = 1:9, trt = rep(1:3, each = 3))

f <- list(y ~ 1, y ~ x, y ~ trt)

modsa <- lapply(f, function(formula) glm(formula, data = d1))
modsb <- lapply(f, glm, data = d1)

update(modsa[[1]], data = d1[1:7, ])
#> Error: object of type 'closure' is not subsettable
update(modsb[[1]], data = d1[1:7, ])
#> Error in FUN(formula = X[[i]], data = d1[1:7, ]): could not find …
Run Code Online (Sandbox Code Playgroud)

r scoping lapply

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