我真的不明白在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) 我是新来的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*变量.
我试图理解 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 …
在这种情况下,为什么未初始化的变量的行为/交互方式与初始化变量不同:
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) 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,但我认为这不会改变答案。
在阅读一些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,我发现它).
我在类内的对象内有一个函数。
类的对象已初始化,我想调用该函数,但该函数需要在类的构造函数上定义一个变量。
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();
今天我遇到了一个奇怪的问题.模式匹配没有看到在where子句下定义的函数.
foo (bar -> 1) = 2
where
bar _ = 1
Run Code Online (Sandbox Code Playgroud)
此代码拒绝编译声明变量bar不存在.
当然,这是一个简单的解决方案,但我对这种范围规则背后的推理感兴趣.
在类定义期间,定义为字典的类变量用于构建第二个字典类变量,这是从第一个缩减而来的子集,如下所示:
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)
由于几个不同的原因,这个错误的性质让我感到困惑:
SUBSET_Y是一个格式良好的字典理解,并引用一个应该在范围内且可访问的符号。SUBSET_X),这也是一个字典理解,该符号ALL_ITEMS是完全明确且可访问的。因此,NameError …我有一些运行良好的代码,并且我在代码中以相同的格式重复了几次,因此我尝试将其包装在通用函数中,一旦我这样做,它就会停止工作。我不知道为什么,但我错过了一些基本的东西。如果您能告诉我我的基本错误,我会很高兴。谢谢。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 中的任何值,即使它应该改变。它运行并且不会抛出任何错误或警告。这可能是一个“范围界定”问题吗?如果是这样我该如何修复它?
scoping ×10
class ×2
function ×2
perl ×2
python ×2
activerecord ×1
common-lisp ×1
dictionary ×1
haskell ×1
javascript ×1
lisp ×1
module ×1
python-3.x ×1
r ×1
scope ×1