草庐IT

ios - libc++abi.dylib 核心数据崩溃 : terminating with uncaught exception of type NSException

coder 2023-09-15 原文

当我尝试将新对象保存到核心数据中时,出现此错误并在尝试保存上下文时崩溃:

libc++abi.dylib: terminating with uncaught exception of type NSException

我已经使用相同的方法将新创建的托管对象保存在许多其他 View Controller 中,并且除此之外都工作正常。当我更改此行时问题开始了:

var managedObjectContext = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)

来自 AppDelegate 中的 .mainQueueConcurrencyType。

这是我在 AppDel 中的持久存储协调器设置:

    lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator = {
    // The persistent store coordinator for the application. This implementation creates and returns a coordinator, having added the store for the application to it. This property is optional since there are legitimate error conditions that could cause the creation of the store to fail.
    // Create the coordinator and store
    let coordinator = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
    let url = self.applicationDocumentsDirectory.appendingPathComponent("SingleViewCoreData.sqlite")
    let options = [NSMigratePersistentStoresAutomaticallyOption: true, NSInferMappingModelAutomaticallyOption: true]
    var failureReason = "There was an error creating or loading the application's saved data."
    do {
        try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: options)
    } catch {
        // Report any error we got.
        var dict = [String: AnyObject]()
        dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data" as AnyObject?
        dict[NSLocalizedFailureReasonErrorKey] = failureReason as AnyObject?

        dict[NSUnderlyingErrorKey] = error as NSError
        let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
        // Replace this with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
        abort()
    }

    return coordinator
}()

这是导致崩溃的一系列函数:

//get a new model for the components, same context, new FRC
    purchaseOrderModel = StockModel()
    purchaseOrderModel.setupManagedObjectContext()
    purchaseOrderModel.tableView = tableView

    if purchaseOrder == nil {
        //delegate?.editModeStateChange(editing: true)
        purchaseOrder = purchaseOrderModel.savePurchaseOrderWith("", supplier: nil, issueDate: Date(), deliveryDate: Date(), deliveryStatus: false)
        delegate?.newItemAdded()
        creatingNewPurchaseOrder = true
    }

调用

 func savePurchaseOrderWith(_ poId: String?, supplier: NSManagedObject?, issueDate: Date, deliveryDate: Date, deliveryStatus: Bool? = nil) -> NSManagedObject {

    let newPurchaseOrder = NSEntityDescription.insertNewObject(forEntityName: "Purchase_Order", into: context)

    newPurchaseOrder.setValue(poId, forKey: "po_id")
    newPurchaseOrder.setValue(issueDate, forKey: "issue_date")
    newPurchaseOrder.setValue(deliveryDate, forKey: "est_delivery_date")
    newPurchaseOrder.setValue(supplier, forKey: "supplier")
    newPurchaseOrder.setValue(deliveryStatus, forKey: "delivered")

    _ = doSaveContext()

    return newPurchaseOrder
}

doSaveContext:

    func doSaveContext() -> Bool {
    do {
        try context.save() //editing POs makes it crash here after changing the created context in app delegate
        return true
    } catch let error as NSError {
        print("Error saving context after delete \(error.localizedDescription)")
        return false
    }
}

我在 try context.save()

上收到了一个 SIGBART

我在这个项目上工作已经有几个月了,但这是地面开发停止的原因,所以帮助会很大。奇怪的是,所有其他创建以 doSaveContext() 结尾的新空对象(比如交付、新产品等)的路径都可以正常工作。

乐于发布额外信息等

更新 1:添加异常断点时,它会在我的模型类的这个函数中中断:

    func controller(_ controller: NSFetchedResultsController<NSFetchRequestResult>, didChange anObject: Any, at indexPath: IndexPath?, for type: NSFetchedResultsChangeType, newIndexPath: IndexPath?) {
        switch type{
        case NSFetchedResultsChangeType.insert:
            //note that for insert we insert a row at _newIndexPath_
            if let insertIndexPath = newIndexPath {
                self.tableView.insertRows(at: [insertIndexPath], with: UITableViewRowAnimation.fade)
            }
        case NSFetchedResultsChangeType.delete:
            //note that for delete we delete the row at _indexPath_
            if let deleteIndexPath = indexPath {
                self.tableView.deleteRows(at: [deleteIndexPath], with: UITableViewRowAnimation.fade)
            }
        case NSFetchedResultsChangeType.update:
            //note that for update we update the row at _indexPath_
            if indexPath != nil {
//                let cell = self.tableView.cellForRowAtIndexPath(updateIndexPath)
//                let supplier = fetchedResultsController.objectAtIndexPath(updateIndexPath)
//                cell!.textLabel?.text = supplier.name
            }
        case NSFetchedResultsChangeType.move:
            //note that for Move we delete the row at _indexPath_
            if let deleteIndexPath = indexPath {
                self.tableView.insertRows(at: [deleteIndexPath], with: UITableViewRowAnimation.fade)
            }
            //note that for move we insert a row at _newIndexPath_
            if let insertIndexPath = newIndexPath {
                self.tableView.insertRows(at: [insertIndexPath], with: UITableViewRowAnimation.fade)
            }
        }
    }

self.tableView.insertRows(at: [insertIndexPath], with: UITableViewRowAnimation.fade) 行上(如果有帮助的话)。在任何地方都找不到清晰的日志。

更新 2:当控制台中断时在控制台中键入 bt 会产生以下结果:

(lldb) bt
* thread #1, queue = 'NSManagedObjectContext 0x6040003cb8b0', stop reason = breakpoint 1.2
    frame #0: 0x000000010c8e3b86 libc++abi.dylib`__cxa_throw
    frame #1: 0x0000000106ee2068 libobjc.A.dylib`objc_exception_throw + 343
    frame #2: 0x0000000107ff8362 CoreFoundation`+[NSException raise:format:arguments:] + 98
    frame #3: 0x0000000106986089 Foundation`-[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 193
    frame #4: 0x00000001096d9430 UIKit`-[UITableView _endCellAnimationsWithContext:] + 18124
    frame #5: 0x00000001096f5524 UIKit`-[UITableView _updateRowsAtIndexPaths:withUpdateAction:rowAnimation:usingPresentationValues:] + 1342
    frame #6: 0x00000001096f55f7 UIKit`-[UITableView insertRowsAtIndexPaths:withRowAnimation:] + 118
  * frame #7: 0x00000001062013fd SC Dev`StockModel.controller(controller=0x00006000000efe00, anObject=Any @ 0x00007fff59ae7458, indexPath=nil, type=insert, newIndexPath=2 indices, self=0x0000600000478940) at StockModel.swift:283
    frame #8: 0x0000000106201f30 SC Dev`@objc StockModel.controller(_:didChange:at:for:newIndexPath:) at StockModel.swift:0
    frame #9: 0x0000000107b6ef17 CoreData`__82-[NSFetchedResultsController(PrivateMethods) _core_managedObjectContextDidChange:]_block_invoke + 5767
    frame #10: 0x0000000107a13bf8 CoreData`developerSubmittedBlockToNSManagedObjectContextPerform + 168
    frame #11: 0x000000010cccb43c libdispatch.dylib`_dispatch_client_callout + 8
    frame #12: 0x000000010ccd2338 libdispatch.dylib`_dispatch_queue_barrier_sync_invoke_and_complete + 392
    frame #13: 0x0000000107a13afe CoreData`-[NSManagedObjectContext performBlockAndWait:] + 286
    frame #14: 0x0000000107b6d877 CoreData`-[NSFetchedResultsController(PrivateMethods) _core_managedObjectContextDidChange:] + 119
    frame #15: 0x0000000107f8f07c CoreFoundation`__CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 12
    frame #16: 0x0000000107f8ef7a CoreFoundation`_CFXRegistrationPost + 442
    frame #17: 0x0000000107f8ecc2 CoreFoundation`___CFXNotificationPost_block_invoke + 50
    frame #18: 0x0000000107f50a32 CoreFoundation`-[_CFXNotificationRegistrar find:object:observer:enumerator:] + 1826
    frame #19: 0x0000000107f4fbac CoreFoundation`_CFXNotificationPost + 652
    frame #20: 0x00000001068c3842 Foundation`-[NSNotificationCenter postNotificationName:object:userInfo:] + 66
    frame #21: 0x00000001079fcbd5 CoreData`-[NSManagedObjectContext(_NSInternalNotificationHandling) _postObjectsDidChangeNotificationWithUserInfo:] + 773
    frame #22: 0x0000000107a9e0ca CoreData`-[NSManagedObjectContext(_NSInternalChangeProcessing) _createAndPostChangeNotification:deletions:updates:refreshes:deferrals:wasMerge:] + 1658
    frame #23: 0x00000001079f6f0f CoreData`-[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] + 2399
    frame #24: 0x00000001079fa7d3 CoreData`-[NSManagedObjectContext save:] + 419
    frame #25: 0x00000001062032fc SC Dev`StockModel.doSaveContext(self=0x0000600000673000) at StockModel.swift:381
    frame #26: 0x000000010620affd SC Dev`StockModel.savePurchaseOrderWith(poId="", supplier=nil, issueDate=2018-02-06 21:17:37 UTC, deliveryDate=2018-02-06 21:17:37 UTC, deliveryStatus=false, self=0x0000600000673000) at StockModel.swift:592
    frame #27: 0x000000010626ce76 SC Dev`PurchaseOrderDetailViewController.viewDidLoad(self=0x00007f941e038800) at PurchaseOrderDetailViewController.swift:68
    frame #28: 0x0000000106270f84 SC Dev`@objc PurchaseOrderDetailViewController.viewDidLoad() at PurchaseOrderDetailViewController.swift:0
    frame #29: 0x000000010975ad51 UIKit`-[UIViewController loadViewIfRequired] + 1235
    frame #30: 0x00000001097a24dc UIKit`-[UINavigationController _updateScrollViewFromViewController:toViewController:] + 68
    frame #31: 0x00000001097a2818 UIKit`-[UINavigationController _startTransition:fromViewController:toViewController:] + 153
    frame #32: 0x00000001097a392f UIKit`-[UINavigationController _startDeferredTransitionIfNeeded:] + 841
    frame #33: 0x00000001097a4b90 UIKit`-[UINavigationController __viewWillLayoutSubviews] + 115
    frame #34: 0x00000001099fb2ae UIKit`-[UILayoutContainerView layoutSubviews] + 231
    frame #35: 0x000000010968b551 UIKit`-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1331
    frame #36: 0x00000001093fb4ba QuartzCore`-[CALayer layoutSublayers] + 153
    frame #37: 0x00000001093ff5a9 QuartzCore`CA::Layer::layout_if_needed(CA::Transaction*) + 401
    frame #38: 0x00000001093881cd QuartzCore`CA::Context::commit_transaction(CA::Transaction*) + 365
    frame #39: 0x00000001093b3ae4 QuartzCore`CA::Transaction::commit() + 500
    frame #40: 0x00000001095e7687 UIKit`_afterCACommitHandler + 272
    frame #41: 0x0000000107f95db7 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23
    frame #42: 0x0000000107f95d0e CoreFoundation`__CFRunLoopDoObservers + 430
    frame #43: 0x0000000107f7a324 CoreFoundation`__CFRunLoopRun + 1572
    frame #44: 0x0000000107f79a89 CoreFoundation`CFRunLoopRunSpecific + 409
    frame #45: 0x000000010f6de9c6 GraphicsServices`GSEventRunModal + 62
    frame #46: 0x00000001095bcd30 UIKit`UIApplicationMain + 159
    frame #47: 0x0000000106142607 SC Dev`main at AppDelegate.swift:18
    frame #48: 0x000000010cd47d81 libdyld.dylib`start + 1

更新 3:将 _ = doSaveContext() 包装在 DispatchQueue.main.async { 中让我更进一步,但仍然在同一个表插入行上中断和以前一样使用以下日志。

    bt
* thread #1, queue = 'NSManagedObjectContext 0x6000001da400', stop reason = breakpoint 1.1
    frame #0: 0x000000010945bf11 libobjc.A.dylib`objc_exception_throw
    frame #1: 0x000000010a572362 CoreFoundation`+[NSException raise:format:arguments:] + 98
    frame #2: 0x0000000108f00089 Foundation`-[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 193
    frame #3: 0x000000010b9e0430 UIKit`-[UITableView _endCellAnimationsWithContext:] + 18124
    frame #4: 0x000000010b9fc524 UIKit`-[UITableView _updateRowsAtIndexPaths:withUpdateAction:rowAnimation:usingPresentationValues:] + 1342
    frame #5: 0x000000010b9fc5f7 UIKit`-[UITableView insertRowsAtIndexPaths:withRowAnimation:] + 118
  * frame #6: 0x000000010877a0cd SC Dev`StockModel.controller(controller=0x00006000000fea00, anObject=Any @ 0x00007fff575731c8, indexPath=nil, type=insert, newIndexPath=2 indices, self=0x000060400046aa00) at StockModel.swift:283
    frame #7: 0x000000010877ac00 SC Dev`@objc StockModel.controller(_:didChange:at:for:newIndexPath:) at StockModel.swift:0
    frame #8: 0x000000010a0e8f17 CoreData`__82-[NSFetchedResultsController(PrivateMethods) _core_managedObjectContextDidChange:]_block_invoke + 5767
    frame #9: 0x0000000109f8dbf8 CoreData`developerSubmittedBlockToNSManagedObjectContextPerform + 168
    frame #10: 0x000000010f23843c libdispatch.dylib`_dispatch_client_callout + 8
    frame #11: 0x000000010f23f338 libdispatch.dylib`_dispatch_queue_barrier_sync_invoke_and_complete + 392
    frame #12: 0x0000000109f8dafe CoreData`-[NSManagedObjectContext performBlockAndWait:] + 286
    frame #13: 0x000000010a0e7877 CoreData`-[NSFetchedResultsController(PrivateMethods) _core_managedObjectContextDidChange:] + 119
    frame #14: 0x000000010a50907c CoreFoundation`__CFNOTIFICATIONCENTER_IS_CALLING_OUT_TO_AN_OBSERVER__ + 12
    frame #15: 0x000000010a508f7a CoreFoundation`_CFXRegistrationPost + 442
    frame #16: 0x000000010a508cc2 CoreFoundation`___CFXNotificationPost_block_invoke + 50
    frame #17: 0x000000010a4caa32 CoreFoundation`-[_CFXNotificationRegistrar find:object:observer:enumerator:] + 1826
    frame #18: 0x000000010a4c9bac CoreFoundation`_CFXNotificationPost + 652
    frame #19: 0x0000000108e3d842 Foundation`-[NSNotificationCenter postNotificationName:object:userInfo:] + 66
    frame #20: 0x0000000109f76bd5 CoreData`-[NSManagedObjectContext(_NSInternalNotificationHandling) _postObjectsDidChangeNotificationWithUserInfo:] + 773
    frame #21: 0x000000010a0180ca CoreData`-[NSManagedObjectContext(_NSInternalChangeProcessing) _createAndPostChangeNotification:deletions:updates:refreshes:deferrals:wasMerge:] + 1658
    frame #22: 0x0000000109f70f0f CoreData`-[NSManagedObjectContext(_NSInternalChangeProcessing) _processRecentChanges:] + 2399
    frame #23: 0x0000000109f747d3 CoreData`-[NSManagedObjectContext save:] + 419
    frame #24: 0x000000010877bfcc SC Dev`StockModel.doSaveContext(self=0x000060000046fec0) at StockModel.swift:381
    frame #25: 0x0000000108783ebe SC Dev`closure #1 in StockModel.savePurchaseOrderWith(self=0x000060000046fec0) at StockModel.swift:593
    frame #26: 0x0000000108783f52 SC Dev`partial apply for closure #1 in StockModel.savePurchaseOrderWith(_:supplier:issueDate:deliveryDate:deliveryStatus:) at StockModel.swift:0
    frame #27: 0x00000001086c0b89 SC Dev`thunk for @callee_owned () -> () at AddProductViewController.swift:0
    frame #28: 0x000000010f2373f7 libdispatch.dylib`_dispatch_call_block_and_release + 12
    frame #29: 0x000000010f23843c libdispatch.dylib`_dispatch_client_callout + 8
    frame #30: 0x000000010f2436f0 libdispatch.dylib`_dispatch_main_queue_callback_4CF + 628
    frame #31: 0x000000010a52fef9 CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 9
    frame #32: 0x000000010a4f4662 CoreFoundation`__CFRunLoopRun + 2402
    frame #33: 0x000000010a4f3a89 CoreFoundation`CFRunLoopRunSpecific + 409
    frame #34: 0x0000000111c579c6 GraphicsServices`GSEventRunModal + 62
    frame #35: 0x000000010b8c3d30 UIKit`UIApplicationMain + 159
    frame #36: 0x00000001086bb2d7 SC Dev`main at AppDelegate.swift:18
    frame #37: 0x000000010f2b4d81 libdyld.dylib`start + 1
(lldb) 

最佳答案

无法确定,但您的堆栈跟踪强烈表明问题与从 NSFetchedResultsControllerDelegate 回调更新您的 TableView 有关。根据您的一条评论,最可能的原因是您没有在任何地方的 TableView 上调用 beginUpdates()

NSFetchedResultsControllerDelegate 更新 TableView 有两种基本方法。首先,简单但不是最佳:不要实现 controllerWillChangeContent(_:)controller(_:didChange:at:for:newIndexPath:)执行实现controllerDidChangeContent(_:),但使用该方法在 TableView 上reloadData()。不要为开始/结束更新或插入/删除/等行而烦恼。

第二个更好但稍微复杂一些,是执行所有这些操作:

  1. 实现 controllerWillChangeContent(_:) 并使用它调用 beginUpdates()
  2. 实现 controller(_:didChange:at:for:newIndexPath:) 以在表中插入/更新/等行。
  3. 实现 controllerDidChangeContent(_:) 并使用它调用 endUpdates()

“开始”和“结束”调用都很重要。我不能 100% 确定这是导致您的特定崩溃的原因,但我希望遗漏 beginUpdates() 会导致某种崩溃。

关于ios - libc++abi.dylib 核心数据崩溃 : terminating with uncaught exception of type NSException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48651308/

有关ios - libc++abi.dylib 核心数据崩溃 : terminating with uncaught exception of type NSException的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  3. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  4. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  5. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  6. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  7. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  8. 由于 libgmp.10.dylib 的问题,Ruby 2.2.0 无法运行 - 2

    我刚刚安装了带有RVM的Ruby2.2.0,并尝试使用它得到了这个:$rvmuse2.2.0--defaultUsing/Users/brandon/.rvm/gems/ruby-2.2.0dyld:Librarynotloaded:/usr/local/lib/libgmp.10.dylibReferencedfrom:/Users/brandon/.rvm/rubies/ruby-2.2.0/bin/rubyReason:Incompatiblelibraryversion:rubyrequiresversion13.0.0orlater,butlibgmp.10.dylibpro

  9. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

  10. += 的 Ruby 方法 - 2

    有没有办法让Ruby能够做这样的事情?classPlane@moved=0@x=0defx+=(v)#thisiserror@x+=v@moved+=1enddefto_s"moved#{@moved}times,currentxis#{@x}"endendplane=Plane.newplane.x+=5plane.x+=10putsplane.to_s#moved2times,currentxis15 最佳答案 您不能在Ruby中覆盖复合赋值运算符。任务在内部处理。您应该覆盖+,而不是+=。plane.a+=b与plane.a=

随机推荐