标签: scoping

如何在Perl模块中使用作用域?

我真的不明白在Perl模块中如何使用作用域.这不会打印任何东西.如果运行a.pl打印1我想要它

b.pm

$f=1;
Run Code Online (Sandbox Code Playgroud)

a.pl

use b;

print $f
Run Code Online (Sandbox Code Playgroud)

perl module scoping

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

为什么ANSI Common Lisp的这个范围示例不能按预期工作?

我是新来的Lisp和贯通进入ANSI Common Lisp的保罗·格雷厄姆和演习之一是这样定义适用,如果任何号码打印出来它会返回默认情况下,八进制打印之前的功能.

我尝试了以下方法:

(let ((*print-base* 8))
  (defun like-apply (&rest args)
    (apply #'apply args)))
Run Code Online (Sandbox Code Playgroud)

但它没有按预期工作:

(like-apply #'princ '(8)); returns 8 8 (expecting 10 8)
Run Code Online (Sandbox Code Playgroud)

然而,以下工作:

(defun apply8 (&rest args)
  (let ((*print-base* 8))
    (apply #'apply args)))
Run Code Online (Sandbox Code Playgroud)

正确返回:

(apply8 #'princ '(8)); returns 10 8 (as expected)
Run Code Online (Sandbox Code Playgroud)

所以我的问题是为什么第二个例子有效,但不是第一个?两者似乎都操纵*print-base*变量.

common-lisp scoping

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

理解 Python 3 中的非本地

我试图理解 Python 3 变量范围和nonlocal.

考虑以下函数(这只是一个示例):

def build_property(something):

    def deco(func):

        def getter(self):
            return getattr(self, something)

        def setter(self, value):
            setattr(self, something, value)

        return property(getter, setter)

    return deco
Run Code Online (Sandbox Code Playgroud)

这在没有nonlocal. 但如果现在我想根据something我需要的非本地条件有条件地创建 getter 和 setter。

def build_property(something):

    def deco(func):

        nonlocal something # This is needed

        if something.startswith('A'):
            getter = None
        else:
            def getter(self):
                return getattr(self, something)

        if something.startswith('B'):
            setter = None
        else:
            def setter(self, value):
                setattr(self, something, value)

        return property(getter, setter)

    return deco
Run Code Online (Sandbox Code Playgroud)

为什么nonlocal在一种情况下需要,但在另一种情况下不需要?换句话说,为什么something如果在第一种情况下正确找到(没有nonlocal …

python scoping python-3.x python-nonlocal

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

使用我们和BEGIN块交互声明的变量

在这种情况下,为什么未初始化的变量的行为/交互方式与初始化变量不同:

use strict;
use warnings;

our($foo) = 0;
BEGIN {
        $foo = 2;
}

our($bar);
BEGIN {
        $bar = 3;
}

print "FOO: <$foo>\n";
print "BAR: <$bar>\n";
Run Code Online (Sandbox Code Playgroud)

结果是:

$ perl test.pl
FOO: <0>
BAR: <3>
Run Code Online (Sandbox Code Playgroud)

Perl版本:

$ perl -v

This is perl 5, version 22, subversion 0 (v5.22.0) built for x86_64-linux
Run Code Online (Sandbox Code Playgroud)

perl scoping lexical-scope

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

如何创建一个在 Rails 5 中没有作用域的作用域?

class Foo < ActiveRecord::Base
  default_scope { where(active: false) }

  scope :include_deleted, -> { unscoped }
Run Code Online (Sandbox Code Playgroud)

这不起作用。它返回范围内的文档。

alias_method :include_deleted, :unscoped
Run Code Online (Sandbox Code Playgroud)

这也不起作用: undefined method 'unscoped'

那么,如何定义一个没有作用域的作用域呢?

用例:是的,我知道我可以只使用unscoped. 让我尝试解释为什么它可能不是一个好主意。有一个很好的理由定义另一个具有相同功能的作用域。原因是它使代码更易于理解,并使我的意图更加明确。unscoped不会告诉读者任何有关默认范围的信息。它只会带来更多的问题。如果我们可以定义另一个作用域来解释我们为什么使用作用域,那么它就会为读者提供上下文并帮助他们理解代码。

顺便说一句,我看到了一些相关的 SO 问题,但它们已经过时了。所以这个问题是关于Rails 5 的。这使它与众不同而不是重复

使用 Mongoid 5,但我认为这不会改变答案。

activerecord ruby-on-rails scoping ruby-on-rails-5

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

你能解释一下这个LISP函数以及为什么问题出现在动态范围内吗?

在阅读一些lisp历史时,从LISP 1到LISP 1.5,我遇到了这个功能:

(define (testr x p f u)
  (if (p x)
      (f x)
      (if (atom? x)
          (u)
          (testr (cdr x)
                 p
                 f
                 (lambda ()
                   (testr (car x) p f u))))))
Run Code Online (Sandbox Code Playgroud)

麦卡锡认为,"困难在于当内部递归发生时,car [x]所需的值是外部值,但实际使用了内部值.在现代术语中,需要词法范围,并获得动态范围. ".

我无法弄清楚他所指的是什么"外部价值"和"内在价值",也无法看到在使用动态范围进行评估时这个函数是如何行为不当的.我能理解lambda是否有些阴影'x',但它是零参数的函数.

(实际上很难找到这个功能,因为它似乎从网页本身中遗漏了.只是在浏览了images.tex文件之后:http://www-formal.stanford.edu/jmc/history/lisp /images.tex,我发现它).

lisp scoping dynamic-scope lexical-scope

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

从对象内的函数获取作用域外的变量 - Javascript

我在类内的对象内有一个函数。

类的对象已初始化,我想调用该函数,但该函数需要在类的构造函数上定义一个变量。

class someClass {
  constructor() {
    this.foo = "bar";

    this.print = {
      variable: function() {
        console.log(this.foo);
      }
    };

  }
}

// And I call it from the global scope

var someObject = new someClass();

someObject.print.variable();
Run Code Online (Sandbox Code Playgroud)

它将打印

不明确的

我知道这是一个不同的范围,也许我无法访问它。

这样做的目的是让我的功能有一定的顺序。

我想访问我的函数,例如 someObject.print.variable();

javascript scope class function scoping

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

ViewPatterns范围界定背后的推理

今天我遇到了一个奇怪的问题.模式匹配没有看到在where子句下定义的函数.

foo (bar -> 1) = 2
  where
    bar _ = 1
Run Code Online (Sandbox Code Playgroud)

此代码拒绝编译声明变量bar不存在.

当然,这是一个简单的解决方案,但我对这种范围规则背后的推理感兴趣.

haskell scoping

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

使用字典理解的 Python 类变量赋值

在类定义期间,定义为字典的类变量用于构建第二个字典类变量,这是从第一个缩减而来的子集,如下所示:

class C(object):
    ALL_ITEMS = dict(a='A', b='B', c='C', d='D', e='E')
    SUBSET_X = {k: v for k, v in ALL_ITEMS.items() if k in ('a', 'b', 'd')}  # (this works)
    SUBSET_Y = {k: ALL_ITEMS[k] for k in ('a', 'b', 'd')}  # (this fails)
Run Code Online (Sandbox Code Playgroud)

非常简单的东西,但执行这段代码的最终效果让我感到非常惊讶。我的第一种方法是第 4 行的代码,但我不得不求助于第 3 行的解决方案。关于字典理解范围规则的一些微妙之处,我显然没有掌握。

具体来说,失败案例中引发的错误是:

File "goofy.py", line 4, in <dictcomp>
   SUBSET_Y = {k: ALL_ITEMS.get(k) for k in ('a', 'b', 'd')}
NameError: name 'ALL_ITEMS' is not defined
Run Code Online (Sandbox Code Playgroud)

由于几个不同的原因,这个错误的性质让我感到困惑:

  1. 分配给SUBSET_Y是一个格式良好的字典理解,并引用一个应该在范围内且可访问的符号。
  2. 在后一种情况下(对 的赋值SUBSET_X),这也是一个字典理解,该符号ALL_ITEMS是完全明确且可访问的。因此,NameError …

python dictionary class scoping

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

将工作代码包装在函数中,它会停止工作

我有一些运行良好的代码,并且我在代码中以相同的格式重复了几次,因此我尝试将其包装在通用函数中,一旦我这样做,它就会停止工作。我不知道为什么,但我错过了一些基本的东西。如果您能告诉我我的基本错误,我会很高兴。谢谢。J

在代码中工作的函数的格式为:

vec1[ as.logical (vec1 == val1 & vec2 >= val2)] <- val3
Run Code Online (Sandbox Code Playgroud)

因此,当满足条件时,这会将 vec1 中的值从当前值更改为 val3。但是,如果我创建一个函数,例如

ChangeState <- function (vec1, vec2, val1, val2, val3) {
    vec1[as.logical(vec1 == va1 & vec2 >= val2)] <- val3
}
Run Code Online (Sandbox Code Playgroud)

然后我这样执行它:

ChangeState(inputvec1, inputvec2, value1, value2, value3)
Run Code Online (Sandbox Code Playgroud)

什么也没发生,它不会改变 vec1 中的任何值,即使它应该改变。它运行并且不会抛出任何错误或警告。这可能是一个“范围界定”问题吗?如果是这样我该如何修复它?

r function scoping

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