- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
问题背景
我有一个问题是基于我自己尝试为以下线程的 OP 想要的行为产生令人满意的解决方法:
主题是(像 SO 的其他一些人一样...)试图模仿符合某些协议(protocol)的通用数组扩展。最近在这个线程中有一个关于这个主题的类似问题:
问题
我的问题涉及下一步。假设我们设法实现了对 Array
的某种通用扩展。 ,符合一些协议(protocol)蓝图,比如 MyProtocol
.因此,从现在开始,假设 Array
实例,对于某些类型的 Generator.Element
(例如,对于 MyTypes
),现在已扩展并符合 MyProtocol
.
然后,对于采用通用 Array
的函数(或者,具体地说,说 <U: _ArrayType ...
,或者可能是 RangeReplaceableCollectionType ...
或 SequenceType ...
)类型)作为参数,有没有办法向实际的泛型数组添加类型约束(U
), 而不仅仅是它的 Generator.Element
类型? (所以不是 ... where Generator.Element.Type == SomeTypeConstraint
)。
例子
我将尝试“实际”展示我的问题,以帮助说明我实际要问的内容。请注意,这是我为此目的能够构建的最大 MWE,如果它可能有点重,我深表歉意。
协议(protocol)(协议(protocol) MyTypes
用作类型 + 协议(protocol) MyProtocol
用于数组扩展):
/* Used as type constraint for Generator.Element */
protocol MyTypes {
var intValue: Int { get }
init(_ value: Int)
func *(lhs: Self, rhs: Self) -> Self
func +=(inout lhs: Self, rhs: Self)
}
extension Int : MyTypes { var intValue: Int { return self } }
extension Double : MyTypes { var intValue: Int { return Int(self) } }
/* Let's not extend 'Float' for now
extension Float : MyTypes { var intValue: Int { return Int(self) } } */
/* Used as extension to Array : blueprints for extension method
to Array where Generator.Element: are constrainted to MyTypes */
protocol MyProtocol {
//typealias T
func foo<T: MyTypes>(a: [T]) -> Int?
}
扩展Array
通过 MyProtocol
;蓝图方法的实现:
extension Array : MyProtocol {
func foo<T: MyTypes>(a: [T]) -> Int? {
/* [T] is Self? proceed, otherwise return nil */
if let b = self.first {
if b is T && self.count == a.count {
var myMultSum: T = T(0)
for (i, sElem) in self.enumerate() {
myMultSum += (sElem as! T) * a[i]
}
return myMultSum.intValue
}
}
return nil
}
}
一些测试,我们对于一个函数,约束 Generator.Element
的 Array
MyTypes
的参数,因此有点隐式断言只有符合 MyProtocol
的数组可以使用函数:
/* Tests */
let arr1d : [Double] = [1.0, 2.0, 3.0]
let arr2d : [Double] = [-3.0, -2.0, 1.0]
let arr1f : [Float] = [1.0, 2.0, 3.0]
let arr2f : [Float] = [-3.0, -2.0, 1.0]
func bar1<U: MyTypes> (arr1: [U], _ arr2: [U]) -> Int? {
return arr1.foo(arr2)
}
let myInt1d = bar1(arr1d, arr2d) // -4, OK
//let myInt1f = bar1(arr1f, arr2f)
/* Error: Cannot convert value of type '[Float]'
to expected argument type '[_]'
OK! Expected as 'Float' does not conform to MyTypes protocol */
现在我们已经到了我的问题的核心,一些我自己无法构建的东西:是否有任何可能的方法显式约束泛型数组,比如 U
, 至 MyProtocol
(对于哪些 Array
对于某些 Generator.Elements
已被约束)?我想做一些事情
func bar2<T: MyTypes, U: protocol<MyProtocol, _ArrayType> where U.Generator.Element == T> (arr1: U, _ arr2: U) -> Int? {
// OK, type 'U' behaves as an array type with elements 'T' (==MyTypes)
var a = arr1
var b = arr2
a.append(T(0))
b.append(T(0))
return a.foo(b)
/* Error: Cannot convert value of type 'U'
to expected argument type '[_]' */
}
let myInt2 = bar2(arr1d, arr2d)
(随意编辑这个问题以改进它,我不是很精通在 SO 上提问的过程和最佳实践)
最佳答案
我设法修复了我的“做一些事情”提案工作,方法是:
从 <U: SequenceType ...
切换到 <U: _ArrayType ...
(查看编辑历史记录),
为了使用泛型数组(泛型 U
)调用我的泛型数组扩展,在调用中显式初始化一个数组,显式告诉接收方调用者参数(泛型 U
)的类型为 Array
(使用 Array(...)
初始化器) ).
因此,我们可以为函数的通用数组参数添加类型约束(协议(protocol)一致性),使用问题中描述的通用数组扩展,然后采用以下协议(protocol)一致性方法:
func bar2<T: MyTypes, U: protocol<MyProtocol, _ArrayType> where U.Generator.Element == T> (arr1: U, _ arr2: U) -> Int? {
// OK, type U behaves as array type with elements T (=MyTypes)
var a = arr1
var b = arr2
a.append(T(2)) // add 2*7 to multsum
b.append(T(7))
return a.foo(Array(b))
/* Ok! */
}
let myInt2 = bar2(arr1d, arr2d) // -4+2*7 = 10, OK
关于arrays - 如何为函数的通用数组参数(而不是其 Generator.Element)添加类型约束(协议(protocol)一致性),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34501723/
我是 Julia 的新手。 我主要用python编程。 在 python 中, 如果你想迭代大量的值, 通常构造一个所谓的生成器来节省内存使用。 这是一个示例代码: def generator(N):
这个问题很奇怪。我试图直接在 build.gradle 中添加一个字符串,因为我需要它来使用 Tray 库 ( https://github.com/grandcentrix/tray )。在我的第一
我正在尝试在我的新 symfony3 项目中使用生成 CRUD 功能。我创建了一个名为 AdminBundle 的 bundle ,其中包含生成器、实体测试以及生成器,所有这些都处理得很好。我检查了我
我尝试理解生成器,但我发现了一个我无法遵循的示例。 // First Generator function* Colors () { yield "blue"; yield* MoreColo
我将制作一款完全由程序生成的空间/交易/战斗游戏。但是,我知道将整个星系的所有细节存储在内存中是不可行的。因此,我一直认为我可以使用种子来生成太阳系,并且从该太阳系,您可以使用跳跃门前往其他太阳系。问
我在 Eclipse Helios 中使用 MyBatis Generator (MyBatis Generator 1.3.1.201101032122),但每次我自动生成持久类时,生成器都会删除属
@GenerateInterface class A {} @GenerateInterface class B { void setA(IA a) {} } 我的注释处理器应该生成这些接口(in
我刚刚在一个空目录中安装了 yeoman,它打印出一个错误。这就是我所做的: npm i yo -g npm i generator-webapp -g 之后我抛出一个错误: require('yeo
我正在使用 NReco PDFGenerator 从 HTML 字符串创建 PDF 文档。当表格被分页符拆分时,表格标题与表格中的下一行重叠(见下图)。 有想法该怎么解决这个吗? 最佳答案 我发现这是
我有这个命名空间: namespace :manage do # Directs /manage/products/* to Manage::ProductsController
我有一个 Open API 3 规范的 yaml 文件,它有一些 x- 前缀的属性。我正在尝试使用 openapi-generator-cli 生成一个 Angular Typescript SDK。
我有一个返回生成器的函数。目前它使用yield from: function foo() { $generator = getGenerator(); // some other st
我选择Symfony2 docs 。据说添加 /** * @ORM\Entity(repositoryClass="Acme\StoreBundle\Entity\ProductRepository
运行命令生成新的 rails 项目: $ rails generate controller home index 以上将创建四个新的 Rails 项目:generate、controller、hom
我们实际上已经将jvm内存增加到了256M,现在老年代看起来很小,但Perm Generation相当高,接近80%。通过 jstat 捕获的示例数据如下。高永久代意味着什么? Timestamp
class Invoice def Invoice.generate(order_id, charge_amount, credited_amount = 0.0) Invoice.new
我在写 this comparison为了帮助人们理解所有这些废话,目前看来,generator-angular 的好处和值(value)只是您使用 generator-angular-fullsta
我有一个包含以下代码段的 OpenAPI 规范文档(我无法控制): servers: - url: http://www.[someservice].com/api 我正在使用这个 OpenAPI
我正在使用 openapi-yaml 将 swagger 文件转换为开放的 API v3 文件。使用 Maven 生成器。 我想做的是将新文件直接放入某个目录。 但是会生成一些我不需要的其他文件,例如
我的生成器中有以下标准文件夹结构。我当前正在努力解决的任务是我目前有一个模板化的 _package.json ,我将其写入磁盘以用于主要生成。我想在编写的 package.json 中包含一个变量,它
我是一名优秀的程序员,十分优秀!