IIFE(Immediately-Invoked Function Expression) 是 JavaScript 中常用的模式。 Swift 看起来也支持这一点。像这样:
let one = { 1 }
/// one: () -> Int
显式类型声明和常量返回函数运行良好。
let one:Int = { $0 }(1)
/// one: Int
但是常量返回函数不能推断出自己的类型。
let one = { $0 }(1)
/// SourceKitService
/// Terminated
///
/// Editor functionality
/// temporarily limited.
然后我强制它像 shell 一样运行。
//推断.swift
#!/usr/bin/xcrun swift
var i:Int = 0
let id = { $0 }(i)
println(id)
Whemphasized textile silgen closureexpr SIL function @_TF8inferredU_FRSiSi for expression at [./inferred.swift:4:10 - line:4:15] RangeText="{ $0 }" [1] 29364 segmentation fault ./inferred.swift
我是否遗漏了什么或者语法有误?
最佳答案
我相信我已经看到一些将 Swift 对这种构造的实现称为“称为闭包”的东西,但我现在找不到它。
注意你的第一个例子:
let one = { 1 }
... 不是所谓的闭包。它定义了一个闭包,但不调用它。因为它没有参数,所以您可以在定义它的同时调用它,方法是在大括号后放置一个空参数列表:
let one = { 1 }()
你也应该能够通过类型推断来做到这一点:
let one = { $0 }(1) // one: (Int) = 1
let i = 1 // i: Int = 1
let one = { $0 }(i) // one: (Int) = 1
这些在 beta 5 上对我有用,但如果 i 是用 var 而不是 let 声明的则不行。 (任何时候你看到编译器或 SourceKit 崩溃它可能是好的 file a bug 。)
被调用的闭包对于设置惰性初始化的存储属性非常有用——第一次获取该属性运行闭包例如,您会在用于设置核心数据堆栈的 Xcode 项目模板中注意到它们:
lazy var managedObjectContext: NSManagedObjectContext? = {
// Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.) This property is optional since there are legitimate error conditions that could cause the creation of the context to fail.
let coordinator = self.persistentStoreCoordinator
if coordinator == nil {
return nil
}
var managedObjectContext = NSManagedObjectContext()
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}()
在这种情况下必须显式给出类型——因为闭包可以返回nil,它的返回类型必须是可选的,但类型检查器无法判断是哪种可选.
关于swift - Swift 中 IIFE 的类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25163311/
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
我想使用PostgreSQL中的point类型。我已经完成了:railsgmodelTestpoint:point最终的迁移是:classCreateTests当我运行时:rakedb:migrate结果是:==CreateTests:migrating====================================================--create_table(:tests)rakeaborted!Anerrorhasoccurred,thisandalllatermigrationscanceled:undefinedmethod`point'for#/hom
希望我没有误解“ducktyping”的含义,但从我读到的内容来看,这意味着我应该根据对象如何响应方法而不是它是什么类型/类来编写代码。代码如下:defconvert_hash(hash)ifhash.keys.all?{|k|k.is_a?(Integer)}returnhashelsifhash.keys.all?{|k|k.is_a?(Property)}new_hash={}hash.each_pair{|k,v|new_hash[k.id]=v}returnnew_hashelseraise"CustomattributekeysshouldbeID'sorPropertyo
我试图像这样在我的测试用例中执行获取:request.env['CONTENT_TYPE']='application/json'get:index,:application_name=>"Heka"虽然,它失败了:ActionView::MissingTemplate:Missingtemplatealarm_events/indexwith{:handlers=>[:builder,:haml,:erb,:rjs,:rhtml,:rxml],:locale=>[:en,:en],:formats=>[:html]尽管在我的Controller中我有:respond_to:html,
我有代码:classScenedefinitialize(number)@number=numberendattr_reader:numberendscenes=[Scene.new("one"),Scene.new("one"),Scene.new("two"),Scene.new("one")]groups=scenes.inject({})do|new_hash,scene|new_hash[scene.number]=[]ifnew_hash[scene.number].nil?new_hash[scene.number]当我启动它时出现错误:freq.rb:11:in`[]'
我正在使用File.open即时创建一个.csv文件。但我需要做的是将文件的Content-Type设置为binary/octet-stream,这样浏览器会自动下载它,而不是仅仅显示它的内容在浏览器中。文件本身在本地创建,然后上传到AmazonS3。 最佳答案 简答无法指定Content-Type创建文件时文件系统中的值。事实上,这可能不是实现目标的最佳方式。为了建议浏览器下载文件而不是显示文件,您可以留下Content-Type:text/csv并添加标题Content-Disposition:attachment或Conten