天道酬勤,学无止境

closures

Python: How can a closure continue its existence after the outer function is reassigned?

问题 我学习了 Python 中的闭包,并且我很好地理解了这个概念。 在 IDLE 中乱搞时,我想如果我重新分配封闭函数然后尝试调用封闭函数会发生什么: >>> def outer_function(hello): message = hello def inner_function(): print(message) return inner_function >>> function = outer_function("hello") >>> function() hello >>> def outer_function(): print("hi") >>> function() hello 我认为这很有趣,但是我意识到我对内存中的闭包等发生的情况没有足够好的理解。有人可以解释一下在重新分配inner_function后如何调用outer_function吗? 回答1 在 CPython(即用 C 编写的参考实现,大多数人认为只是“Python”)中,词法闭包被实现为“平面闭包”(参见 PEP 227),它使用单元对象引用而不是搜索框架对象的链接列表(嵌套范围)在运行时。 这允许在返回闭包函数时快速查找并改进垃圾收集。 outer_function中的字节码专门用于访问堆栈帧中的单元对象,而不是直接引用message对象。 解释器在为调用设置堆栈帧时知道这一点

2022-05-16 23:40:08    分类:技术分享    python   function   memory   closures

Passing closure to trait method: expected type parameter, found closure

问题 我对如何让这个工作有点困惑,我已经把它从真实的东西上剪下来了。 我写了一个特质: pub trait Renderable<F: Fn(&PropertyTags)> { fn set_property_changed_callback(&mut self, callback: Option<F>); } add_child的 'child' 参数受其限制,而PropertyTags只是一个枚举。 我已经包含了child类型的模拟实现来演示我的用法: pub struct Child<F: Fn(&PropertyTags)> { property_changed_callback: Option<F>, } impl<F: Fn(&PropertyTags)> Renderable<F> for Child<F> { fn set_property_changed_callback(&mut self, callback: Option<F>) { self.property_changed_callback = callback; } } 然后这些将用作: pub fn add_child<REND, C>(&mut self, child: &mut REND) where C: Fn(&PropertyTags), REND: Renderable<C> { let

2022-05-15 20:46:16    分类:技术分享    rust   closures

How to include an already documented method in jsdoc-toolkit?

问题 我有一个使用闭包方法创建的 JavaScript 单例对象: /** * This is the singleton. * * @namespace window.Something.Singleton */ window.Something.Singleton = (function() { /** * Foo method. * * @return {String} this method always returns with <code>bar</code> */ function _foo() { return "bar"; } /** * @lends window.Something.Singleton# */ return { /** * @borrows window.Something-_foo * @function */ foo: _foo }; }()); 但是 jsdoc-toolkit 不会生成从_foo方法到foo方法的继承文档,这是我想要的。 如果我写@see而不是@borrows它可以工作(插入指向正确方法的链接),但我不想复制&粘贴foo方法的文档以获得公共文档。 回答1 我做了一些测试,我有好消息和坏消息:)。 好消息是,您似乎可以通过将@borrows标记放在 Singleton 文档注释中来使其工作: /** * This is

2022-05-15 11:01:05    分类:技术分享    javascript   closures   jsdoc

let vs var: scopes in for-loop [duplicate]

问题 这个问题在这里已经有了答案: `let` 的解释和使用 for 循环的块范围3 个答案 4年前关闭。 有人解释一下(var 和 let in for 循环之间的行为差​​异)吗? 经典面试题(结语): let a = []; for (var i=0; i<10; i++) { a[i] = function() { console.log(i,); } } a[0](); // 10 a[1](); // 10 如果我们使用 let: let a = []; for (let i=0; i<10; i++) { // var => let a[i] = function() { console.log(i); } } a[0](); // 1 a[1](); // 2 是的,在使用“let”时,i 是正常的并且符合预期。 我想到的第一个想法是让不支持关闭。 但是不,它支持。 (以下在 Chrome 上进行了测试): function bb() { let b = 1; return function() { console.log(b); } } bb()(); // 1, means a closure is created 那么我的第二个解释是:在 for 循环中使用 let 时。 对于每个循环,它都会重复创建一个新的 i。 我在 chrome 调试器中证明了这一点。

2022-05-14 18:32:22    分类:技术分享    javascript   for-loop   ecmascript-6   closures

Do capture lists of inner closures need to redeclare `self` as `weak` or `unowned`?

问题 如果我有一个闭包传递给这样的函数: someFunctionWithTrailingClosure { [weak self] in anotherFunctionWithTrailingClosure { [weak self] in self?.doSomething() } } 如果我在 someFunctionWithTrailingClosure 的捕获列表anotherFunctionWithTrailingClosure self 声明为[weak self]而没有在someFunctionWithTrailingClosure的捕获列表中再次将其重新声明为weak self已经成为Optional类型,但它是否也成为weak引用? 谢谢! 回答1 不需要anotherFunctionWithTrailingClosure中的[weak self] 。 您可以凭经验对此进行测试: class Experiment { func someFunctionWithTrailingClosure(closure: @escaping () -> Void) { print("starting", #function) DispatchQueue.main.asyncAfter(deadline: .now() + 1) { closure() print(

2022-05-14 17:54:51    分类:技术分享    swift   closures   automatic-ref-counting   weak-references   unowned-references

Design a Python API for existing Java API

问题 我是 python 新手,我必须设计一个类似于现有 Java API 的 Python API(版本 - 2.7) Python 版本 - 2.7 Java API 如下 public interface Process<T> { Future<T> create(Client<T> client) //Other methods } public interface Client<T> extends Serializable { T execute(ClientContext c) //Other methods } public interface ClientContext { File createFile(String path) //Other methods } 我想出的等效 Python API 设计是 方法1 class Process: __metaclass__ = ABCMeta @abstractmethod def create(self, client): pass class Client: __metaclass__ = ABCMeta @abstractmethod def execute(self, context): pass class ClientContext: __metaclass__ = ABCMeta

2022-05-14 10:49:15    分类:技术分享    java   python   python-2.7   closures   api-design

How can swift closure reference properties of class its running from?

问题 我有下面列出的以下 2 个控制器。 我正在使用委托来尝试创建一个progressWindow,它将运行代码并很好地打印它,但代码是任意的。 闭包由符合协议的类定义(在我的情况下为 SyncViewController),但我想从 SyncViewControllers codeToRun {} 闭包更改 progressWindowViewController 的 UI。 我该怎么做呢? SyncViewController.swift import UIKit class SyncViewController: UIViewController, progressWindowDelegate { var codeToRun = { //(self as! ProgressWindowViewController).theTextView.text = "changed the text" print("code to run") } var codeToCancel = {print("code to cancel")} var titleToGive = "Starting Sync..." override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading

2022-05-13 11:21:13    分类:技术分享    ios   swift   swift2   closures   protocols

Undefined Variable Inside Mail::send in Laravel 5

问题 public function postAcceptedSign($md5) { $notif = CustomerOrder::where('sign_link', '=', $md5)->get(); Mail::send('emails.signed-notif', ['order_num' => $notif[0]->order_number], function ($m) { $m->to('mis@qdf-phils.com', '')->subject('Customer Order '.$notif[0]->order_number.' is now signed'); }); Session::flash('alert-success', 'Order Signed.'); return Redirect::to('home'); } 我得到Undefined variable: notif指向这个 Mail::send('emails.signed-notif', ['order_num' => $notif[0]->order_number], function ($m) { $m->to('mis@qdf-phils.com', '')->subject('Customer Order '.$notif[0]->order_number.' is

2022-05-12 09:24:12    分类:技术分享    php   variables   laravel   laravel-5   closures

Trying to simplify some Javascript with closures

问题 我正在尝试简化一些使用闭包的 JS 代码,但我无处可去(可能是因为我不了解闭包) 我有一些看起来像这样的代码: var server = http.createServer(function (request, response) { var httpmethods = { "GET": function() { alert('GET') }, "PUT": function() { alert('PUT') } }; }); 我试图以这种方式简化它: var server = http.createServer(function (request, response) { var httpmethods = { "GET": function() { alertGET() }, "PUT": function() { alertPUT() } }; }); function alertGET() { alert('GET'); } function alertPUT() { alert('PUT'); } 不幸的是,这似乎不起作用......因此: - 我做错了什么? - 是否有可能做到这一点? - 如何? TIA -- MV 回答1 没有正确设置对象,您将函数名称作为字符串放在 httpmethods 对象中,而不是给它们命名 - 尝试这样的事情: var server

2022-05-10 06:29:03    分类:技术分享    javascript   closures

Scope chain look-up vs prototype look-up - Which is when

问题 如果一个变量在需要时在函数中不可用,则在作用域链中查找它(这是一个闭包),但其他时候在原型链中搜索它。 我正试图将我的头包裹起来,这是什么时候发生的。 我想知道是否有人可以为我清除迷雾,或者让我参考一些专门讨论这个话题的文献。 例如,我是否正确地说: - 始终在原型链中查找对象以及与上下文(this)相关的公共变量? - 私有变量总是在作用域链中查找(即执行上下文中的函数链)? - 是否有任何情况下程序同时查看/查看? 我测试了三种不同的场景(范围链查找、原型查找和不查找),但不幸的是,它对深入了解它没有足够的帮助。 var Food = function(){ var t = 1; // for closure this.timeToPrepare = function(){ // Scope chain lookup console.log(t * 3); }; this.timeToMake = function(){ // This is looked up in the prototype chain console.log(this.t * 3); }; this.timeToEat = function(t){ //No lookup console.log(t * 3); }; }; Food.prototype.t = 2; (function(){ var

2022-05-09 18:17:58    分类:技术分享    javascript   closures   prototypal-inheritance   scope-chain