使用Swift,我想编写一个协议,指定实现类必须具有一个带枚举的函数(它遵循给定的协议),其中枚举类型通常是指定的.我试过这个:
protocol Message {}
protocol Subscriber {
func receive<T where T:Message>(message:T)
}
enum Greeting : Message {
case Hello, Goodbye
}
class SomeObject : Subscriber {
func receive<Greeting>(message: Greeting) {
switch message {
case .Hello:
println("Hello")
case .Goodbye:
println("Goodbye")
}
}
}
Run Code Online (Sandbox Code Playgroud)
这无法使用消息"枚举案例模式无法匹配每个案例行中非枚举类型'Greeting'的值来编译.这似乎是因为订阅者协议期望一些不比Message更专业的东西,但我根据Greeting设置,虽然它实现了Message,但它更专业.(我对吗?)
那么,我该怎么做我想做的事,拜托?
在R中,我有一个非常重要的对象列表(它们不是像R可以预期能够定义订单的标量的简单对象).我想对列表进行排序.大多数语言允许程序员提供比较传递给排序函数的一对列表元素的函数或类似函数.我怎样才能对列表进行排序?
我在单个R文件中有代码,我希望能够在开发期间在RStudio中获取源(即,定义我的函数等),并且还#! /usr/bin/env Rscript通过命令行使用语法运行(实际上,使用Hadoop).对于后者,我需要做的最后一件事就是Rscript开始分析(即,使用对main()函数的调用).对于前者,我不希望我的main()函数被调用.我希望能够测试代码是否在Rscript中运行(或者,在RStudio中运行),以便我可以执行main()或不执行.请问这可能吗?
一种解决方案是将我的代码分解为多个文件,但如果可能的话,我宁愿避免这种情况(使Hadoop的内容稍微容易一些).
提前致谢.
问题标题说明了一切,真的:在球拍中将一个函数映射到列表中的最佳方法是什么?谢谢.
我是Haskell的新手,对类型类的工作原理有点困惑.这是我正在尝试做的事情的简化示例:
data ListOfInts = ListOfInts {value :: [Int]}
data ListOfDoubles = ListOfDoubles {value :: [Double]}
class Incrementable a where
increment :: a -> a
instance Incrementable ListOfInts where
increment ints = map (\x -> x + 1) ints
instance Incrementable ListOfDoubles where
increment doubles = map (\x -> x + 1) doubles
Run Code Online (Sandbox Code Playgroud)
(我意识到递增列表中的每个元素可以非常简单地完成,但这只是一个更复杂问题的简化版本.)
编译器告诉我,我有多个声明value.如果我改变的定义ListOfInts和ListOfDoubles如下:
type ListOfInts = [Int]
type ListOfDoubles = [Double]
Run Code Online (Sandbox Code Playgroud)
然后编译器说"'增量ListOfInts'的非法实例声明"(并且类似于ListOfDoubles.如果我使用newtype,例如newtype ListOfInts = ListOfInts [Int],那么编译器告诉我"无法将预期类型'ListOfInts'与实际类型'[b0]'匹配"(同样适用于ListOfDoubles.
我对类型类的理解是它们促进了多态性,但我显然遗漏了一些东西.在上面的第一个例子中,编译器是否只看到type参数 …
正如标题所说,我希望能够使用zip-conduit从zip存档中的文件中读取行(我正在处理的zip文件非常大,所以我需要能够做到这在恒定的记忆中).我理解了管道的基本概念,但从来没有在愤怒中使用它们,并且我对从何处开始感到困惑.我已经阅读了管道教程,但是我无法将其与我的问题相匹配.
zip-conduit文档说,可以通过以下内容从zip存档中获取:
import qualified Data.Conduit.Binary as CB
import Codec.Archive.Zip
withArchive archivePath $ do
name:_ <- entryNames
sourceEntry name $ CB.sinkFile name
Run Code Online (Sandbox Code Playgroud)
我认为我需要做的就是写一些代替的东西CB.sinkFile.Data.Conduit.Text有一个lines功能 - 这可以用某种方式来获取文件的行吗?
我真的很感激一个简单的例子,比如putStrLn用来写出一个存档在zip文件中的简单文本文件的行.提前致谢.
在iOS上使用CloudKit,是否可以确定特定查询匹配的记录数?
我实际上并不想阅读记录本身,我只是想知道查询匹配了多少条记录.我知道匹配的记录是批量返回的,所以原则上我可以获得每批记录,并通过对每批中的数字求和来计算记录总数.但是,对于此应用程序,匹配记录的数量可能会很大,并且鉴于我对实际记录内容不感兴趣,这似乎效率低下且浪费.
提前致谢.
给定表示一段时间的NSTimeInterval,如何创建一个人类可读的字符串,以一种尊重i18N的方式表达该时间段?
例如,如果NSTimeInterval等于10823.23435秒,那么将一些合理的方法呈现为美国人的字符串可能是:
(即你在秒表上看到的东西.)
据推测,其他区域设置可能使用不同的渲染.
我知道NSDateFormatter和NSNumberFormatter,但我不清楚是否或如何使用其中一个来解决这个问题.
我也知道FormatterKit,但这只是相对时间段(例如,"3分钟前").我正在寻找绝对的时间段.
制作我自己的特定于语言环境的解决方案是微不足道的,但是这个问题已经解决了吗?
谢谢.
我有一些使用Xcode 7 beta 3编译的Swift 2代码的问题.
我有一个类(见下文)有一个初始化器,它接受一个函数f,它可以抛出.如果f不抛出,则应将成员变量(self.result)设置为包含f返回值的枚举实例.如果f确实抛出,则应将self.result设置为枚举的实例,表示该值不存在.在初始化程序结束时,self.result不应该为零.我检查了f不抛出的情况,行为是正确的.但是,在f抛出的情况下,self.result在初始化器的末尾是nil(触发断言).如果我单步进入调试器,我看到self.result似乎立即被设置然后闪回到零.
(注意:您可能会建议我将结果表示为nil,而不是包含在枚举中.但是,我需要对f的结果尚未计算,已成功计算或者attemopt已用于计算结果,但它已失败.因此枚举.)
我误解了Swift 2的错误处理是如何工作的吗?或者,编译器/调试器等是否表现不正常?
提前致谢.
internal enum Result<T> {
case Value(T)
case None
}
public final class MyClass<T> {
internal var result: Result<T>? = nil
private init(f: () throws -> T) {
let queueName = “some.string”
let queue = dispatch_queue_create(queueName, DISPATCH_QUEUE_CONCURRENT)
dispatch_async(queue) {
do {
let value = try f()
self.result = .Value(value)
}
catch {
self.result = .None
}
assert(self.result != nil, "Result must have value before block returns.")
}
}
}
Run Code Online (Sandbox Code Playgroud) 假设我有一个带有10个元素的std::vector调用vec,我想创建一个std::vector包含vec的第2和第5个元素之间(包括)的所有元素的新元素.我可以看到我如何写一个for循环来做到这一点,但看起来STL copy()可以更简洁地做到这一点.但我并没有真正得到迭代器:我已经看到你如何使用start()和end()迭代从第一个元素到最后一个元素的向量,但是上面的情况如何,我想要一些略有不同的东西?谢谢.