คำถามติดแท็ก closures

การปิดเป็นฟังก์ชั่นชั้นหนึ่งที่อ้างถึงตัวแปร (ปิด) กว่าจากขอบเขตที่มันถูกกำหนด หากการปิดยังคงมีอยู่หลังจากขอบเขตการกำหนดสิ้นสุดลงตัวแปรที่ปิดลงจะยังคงมีอยู่เช่นกัน

9
จับตัวแปรในวงใน C #
ฉันพบปัญหาที่น่าสนใจเกี่ยวกับ C # ฉันมีรหัสเช่นด้านล่าง List<Func<int>> actions = new List<Func<int>>(); int variable = 0; while (variable < 5) { actions.Add(() => variable * 2); ++ variable; } foreach (var act in actions) { Console.WriteLine(act.Invoke()); } ฉันคาดหวังให้มันส่งออก 0, 2, 4, 6, 8 อย่างไรก็ตามจริงๆแล้วมันส่งออกห้า 10s ดูเหมือนว่าเกิดจากการกระทำทั้งหมดที่อ้างถึงตัวแปรที่ถูกจับหนึ่งตัว ดังนั้นเมื่อพวกเขาได้รับการเรียกพวกเขาทั้งหมดมีผลลัพธ์ที่เหมือนกัน มีวิธีแก้ไขข้อ จำกัด นี้เพื่อให้แต่ละอินสแตนซ์การดำเนินการมีตัวแปรที่จับภาพได้หรือไม่?

6
ฟังก์ชั่น PHP แบบเรียกซ้ำแบบไม่ระบุชื่อ
เป็นไปได้ไหมที่มีฟังก์ชัน PHP ที่เรียกซ้ำและไม่ระบุชื่อ? นี่คือความพยายามของฉันในการทำให้มันใช้งานได้ แต่มันไม่ผ่านชื่อฟังก์ชั่น $factorial = function( $n ) use ( $factorial ) { if( $n <= 1 ) return 1; return $factorial( $n - 1 ) * $n; }; print $factorial( 5 ); ฉันรู้ด้วยเช่นกันว่านี่เป็นวิธีที่ไม่ดีที่จะนำแฟคทอเรียลมาเป็นตัวอย่างเท่านั้น

12
'การปิด' ใน. NET คืออะไร
การปิดคืออะไร เรามีไว้ใน. NET หรือไม่ หากมีอยู่ใน. NET คุณช่วยอธิบายข้อมูลโค้ด (โดยเฉพาะอย่างยิ่งใน C #) ได้ไหม?
195 .net  closures 

8
var self = นี่?
โดยใช้วิธีการเช่นการเรียกกลับเป็นสำหรับการจัดการเหตุการณ์การเปลี่ยนแปลงขอบเขตของthisจาก"อินสแตนซ์ของฉัน"เพื่อ"สิ่งที่เรียกว่าเพียงแค่โทรกลับ" ดังนั้นรหัสของฉันมีลักษณะเช่นนี้ function MyObject() { this.doSomething = function() { ... } var self = this $('#foobar').bind('click', function(){ self.doSomethng() // this.doSomething() would not work here }) } มันใช้งานได้ แต่เป็นวิธีที่ดีที่สุดที่จะทำหรือไม่ มันดูแปลกสำหรับฉัน

5
พารามิเตอร์การปิดการหลบหลีกที่รวดเร็วและเป็นตัวเลือก
ได้รับ: typealias Action = () -> () var action: Action = { } func doStuff(stuff: String, completion: @escaping Action) { print(stuff) action = completion completion() } func doStuffAgain() { print("again") action() } doStuff(stuff: "do stuff") { print("swift 3!") } doStuffAgain() มีวิธีใดที่จะทำให้completionพารามิเตอร์ (และaction) ของประเภทAction?และเก็บไว้ด้วย@escaping? การเปลี่ยนชนิดจะทำให้เกิดข้อผิดพลาดต่อไปนี้: คุณลักษณะ @escaping ใช้กับประเภทฟังก์ชันเท่านั้น การลบ@escapingแอ็ตทริบิวต์โค้ดจะคอมไพล์และรัน แต่ดูเหมือนจะไม่ถูกต้องเนื่องจากการcompletionปิดกำลังหลบหนีขอบเขตของฟังก์ชัน

11
ฉันจะเรียก 3 ฟังก์ชั่นเพื่อดำเนินการหนึ่งฟังก์ชั่นได้อย่างไร?
ถ้าฉันต้องการเรียกฟังก์ชั่นนี้ทีละอัน $('#art1').animate({'width':'1000px'},1000); $('#art2').animate({'width':'1000px'},1000); $('#art3').animate({'width':'1000px'},1000); ฉันรู้ใน jQuery ฉันสามารถทำสิ่งที่ชอบ: $('#art1').animate({'width':'1000px'},1000,'linear',function(){ $('#art2').animate({'width':'1000px'},1000,'linear',function(){ $('#art3').animate({'width':'1000px'},1000); }); }); แต่สมมติว่าฉันไม่ได้ใช้ jQuery และฉันต้องการโทร: some_3secs_function(some_value); some_5secs_function(some_value); some_8secs_function(some_value); ฉันควรจะเรียกใช้ฟังก์ชันนี้เพื่อดำเนินการsome_3secs_functionอย่างไรและหลังจากที่การโทรสิ้นสุดลงแล้วดำเนินการsome_5secs_functionและหลังการโทรสิ้นสุดลงแล้วโทรsome_8secs_function? UPDATE: สิ่งนี้ยังไม่ทำงาน: (function(callback){ $('#art1').animate({'width':'1000px'},1000); callback(); })((function(callback2){ $('#art2').animate({'width':'1000px'},1000); callback2(); })(function(){ $('#art3').animate({'width':'1000px'},1000); })); ภาพเคลื่อนไหวสามภาพเริ่มต้นในเวลาเดียวกัน ความผิดพลาดของฉันอยู่ที่ไหน

2
การปิดใช้พารามิเตอร์ที่ไม่หลบหนีอาจทำให้สามารถหลบหนีได้
ฉันมีโปรโตคอล: enum DataFetchResult { case success(data: Data) case failure } protocol DataServiceType { func fetchData(location: String, completion: (DataFetchResult) -> (Void)) func cachedData(location: String) -> Data? } ด้วยตัวอย่างการใช้งาน: /// An implementation of DataServiceType protocol returning predefined results using arbitrary queue for asynchronyous mechanisms. /// Dedicated to be used in various tests …

9
การปิดคำศัพท์ทำงานอย่างไร
ขณะที่ฉันกำลังตรวจสอบปัญหาที่ฉันมีเกี่ยวกับการปิดคำศัพท์ในรหัส Javascript ฉันมาพร้อมปัญหานี้ใน Python: flist = [] for i in xrange(3): def func(x): return x * i flist.append(func) for f in flist: print f(2) lambdaหมายเหตุว่าตัวอย่างนี้สติหลีกเลี่ยง มันพิมพ์ "4 4 4" ซึ่งน่าแปลกใจ ฉันคาดหวัง "0 2 4" รหัส Perl ที่เทียบเท่านี้ไม่ถูกต้อง: my @flist = (); foreach my $i (0 .. 2) { push(@flist, sub …

6
วิธีใช้ Swift @autoclosure
ฉันสังเกตเห็นเมื่อเขียนassertใน Swift ว่าค่าแรกพิมพ์เป็น @autoclosure() -> Bool มีวิธีการมากเกินไปที่จะกลับทั่วไปค่าต่อการดำรงอยู่การทดสอบผ่านทางTLogicValue protocol อย่างไรก็ตามการเกาะติดกับคำถามในมืออย่างเคร่งครัด แต่ดูเหมือนว่ามันต้องการที่ส่งกลับ@autoclosureBool การเขียนการปิดจริงที่ไม่มีพารามิเตอร์และส่งคืน Bool ไม่ทำงานฉันต้องการเรียกการปิดเพื่อให้คอมไพล์เช่น: assert({() -> Bool in return false}(), "No user has been set", file: __FILE__, line: __LINE__) อย่างไรก็ตามเพียงผ่าน Bool ทำงาน: assert(false, "No user has been set", file: __FILE__, line: __LINE__) แล้วเกิดอะไรขึ้น คือ@autoclosureอะไร แก้ไข: @auto_closureถูกเปลี่ยนชื่อ@autoclosure
148 closures  swift 

7
เก็บการปิดเป็นตัวแปรใน Swift
ใน Objective-C คุณสามารถกำหนดอินพุตและเอาต์พุตของบล็อกเก็บหนึ่งในบล็อกเหล่านั้นที่ส่งผ่านไปยังเมธอดจากนั้นใช้บล็อกนั้นในภายหลัง: // in .h typedef void (^APLCalibrationProgressHandler)(float percentComplete); typedef void (^APLCalibrationCompletionHandler)(NSInteger measuredPower, NSError *error); // in .m @property (strong) APLCalibrationProgressHandler progressHandler; @property (strong) APLCalibrationCompletionHandler completionHandler; - (id)initWithRegion:(CLBeaconRegion *)region completionHandler:(APLCalibrationCompletionHandler)handler { self = [super init]; if(self) { ... _completionHandler = [handler copy]; .. } return self; } - (void)performCalibrationWithProgressHandler:(APLCalibrationProgressHandler)handler …

2
นี่เป็นข้อบกพร่องของคอมไพเลอร์ C # หรือไม่?
ฉันกำลังตอบคำถามเกี่ยวกับความเป็นไปได้ของการปิด (อย่างถูกกฎหมาย) การยืดอายุการใช้งานของวัตถุเมื่อฉันพบโค้ดโคเจนที่แปลกประหลาดมากในส่วนของคอมไพเลอร์ C # (4.0 ถ้าสำคัญ) repro ที่สั้นที่สุดที่ฉันสามารถค้นหาได้มีดังต่อไปนี้: สร้างแลมบ์ดาที่จับภาพท้องถิ่นในขณะที่เรียกใช้ วิธีการคงที่ของประเภทที่มี กำหนดผู้รับมอบสิทธิ์อ้างอิงสร้างฟิลด์อินสแตนซ์ของวัตถุที่ประกอบด้วย ผลลัพธ์: คอมไพเลอร์สร้างการปิดวัตถุที่อ้างอิงวัตถุที่สร้างแลมบ์ดาเมื่อไม่มีเหตุผล - เป้าหมาย 'ภายใน' ของผู้รับมอบสิทธิ์เป็นวิธีการคงที่และสมาชิกอินสแตนซ์ของแลมบ์ด้าการสร้างวัตถุไม่จำเป็น ถูก (และไม่) แตะเมื่อผู้รับมอบสิทธิ์ถูกดำเนินการ คอมไพเลอร์ทำหน้าที่เหมือนโปรแกรมเมอร์ที่จับได้thisโดยไม่มีเหตุผล class Foo { private Action _field; public void InstanceMethod() { var capturedVariable = Math.Pow(42, 1); _field = () => StaticMethod(capturedVariable); } private static void StaticMethod(double arg) { } …

8
ฉันจะเรียกใช้การเรียกกลับแบบอะซิงโครนัสใน Playground ได้อย่างไร
วิธีการ Cocoa และ CocoaTouch จำนวนมากมีการเรียกกลับที่สมบูรณ์ซึ่งนำไปใช้เป็นบล็อกใน Objective-C และ Closures ใน Swift อย่างไรก็ตามเมื่อลองใช้สิ่งเหล่านี้ใน Playground จะไม่มีการเรียกความสมบูรณ์ ตัวอย่างเช่น: // Playground - noun: a place where people can play import Cocoa import XCPlayground let url = NSURL(string: "http://stackoverflow.com") let request = NSURLRequest(URL: url) NSURLConnection.sendAsynchronousRequest(request, queue:NSOperationQueue.currentQueue() { response, maybeData, error in // This block never gets …

10
คีย์เวิร์ด nonlocal ใน Python 2.x
ฉันพยายามใช้การปิดใน Python 2.6 และฉันต้องการเข้าถึงตัวแปร nonlocal แต่ดูเหมือนว่าคีย์เวิร์ดนี้จะไม่มีใน python 2.x วิธีหนึ่งจะเข้าถึงตัวแปร nonlocal ในการปิดใน python เวอร์ชันเหล่านี้ได้อย่างไร

1
การปิดใช้ Fn, FnMut และ FnOnce เมื่อใด
อะไรคือเงื่อนไขที่เฉพาะเจาะจงสำหรับการปิดการใช้Fn, FnMutและFnOnceลักษณะ? นั่นคือ: เมื่อใดที่การปิดไม่ใช้FnOnceลักษณะ? เมื่อใดที่การปิดไม่ใช้FnMutลักษณะ? เมื่อใดที่การปิดไม่ใช้Fnลักษณะ? ยกตัวอย่างเช่นกรรมวิธีรัฐของการปิดบนของร่างกายทำให้คอมไพเลอร์ไม่ได้ดำเนินการFnเกี่ยวกับมัน
114 rust  closures 

12
การเรียกการปิดที่กำหนดให้กับคุณสมบัติของวัตถุโดยตรง
ฉันต้องการที่จะสามารถเรียกการปิดที่ฉันกำหนดให้กับคุณสมบัติของวัตถุได้โดยตรงโดยไม่ต้องกำหนดการปิดให้กับตัวแปรแล้วเรียกมัน เป็นไปได้หรือไม่ Fatal error: Call to undefined method stdClass::callback()โค้ดข้างล่างนี้ไม่ทำงานและสาเหตุ $obj = new stdClass(); $obj->callback = function() { print "HelloWorld!"; }; $obj->callback();

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.