- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个带有约束类型参数的方法,我希望能够在具有 x
的任何对象上使用该方法。和y
类型 Float
:
public static function nearest<T:{var x:Float; var y:Float;}>
(x1:Float, y1:Float, objs:Array<T>, distanceMetric:Float->Float->Float->Float->Float):T {
// Snip. Returns the object nearest to x1,y1
}
这样做的问题是,当 x
时,类型约束检查失败。和/或 y
在提供的T
是具有 getter 或 setter 的属性,会导致如下错误:
Constraint check failure for nearest.T
Inconsistent access for field x : (get,set) should be (default,default)
我认为将类字段和属性视为与编写通用算法相同的方法会很巧妙。如果这在类型约束下是不可能的,那么有没有办法可以使用 Haxe 3.2 来完成?
最佳答案
扩展@clemos的答案 - 不可能将类字段和属性视为与简单的 typedef 相同,因为 Haxe getter 和 setter 在编译时解析 -有一种替代方法可以处理这个问题。
但是,这有点麻烦。您可以看到它的实际效果 here .
首先,我们在适用于变量和属性的包装器上构建一个抽象:
// let's start with our possible point types
typedef NoGetters = { x:Float, y:Float };
typedef WithProperties = { var x(get,set):Float; var y(get,set):Float; };
// now, let's prepare a common implementation for them
typedef SomePoint2Impl<T> = { obj:T, get_x:Void->Float, get_y:Void->Float };
// and use it in and abstract
abstract SomePoint2<T>(SomePoint2Impl<T>) from SomePoint2Impl<T> {
// these wrap points in the common type
@:from static function fromNoGetters<T:NoGetters>(p:T):SomePoint2<T>
return { obj : p, get_x : function () return p.x, get_y : function () return p.y };
@:from static function fromWithProperties<T:WithProperties>(p:T):SomePoint2<T>
return { obj : p, get_x : function () return p.x, get_y : function () return p.y };
// and this restores the original type from the common one
@:to function toOriginal():T
return this.obj;
}
现在,我们在原始 nearest
方法的简化 Point->Point
版本中使用此抽象并对其进行测试。
// a test class for points with properties
// (points without properties can be tested with anonymous structs)
// don't use @:isVar, so that is clear that the getter was called
class TestPoint {
var _x:Float;
var _y:Float;
public var x(get,set):Float;
function get_x() return _x;
function set_x(x) return _x = x;
public var y(get,set):Float;
function get_y() return _y;
function set_y(y) return _y = y;
public function toString()
return '(x:$x, y:$y)';
public function new(x,y)
{
_x = x;
_y = y;
}
}
class Test {
// a simplified function that takes some "point" and returns it back
// it retains the basic type system problem as `nearest`
public static function test<T>(p:SomePoint2<T>)
return p;
static function main()
{
// some points
var p1 = { x:1., y:2. };
var p2 = new TestPoint(1, 2);
// calls to test
var t1 = test(p1);
var t2 = test(p2);
$type(t1);
$type(t2);
// show that identity has been preserved
// t1,t2 both get cast back to their original types
trace(t1 == p1);
trace(t2 == p2);
// show explicit conversions
trace((t1:{x:Float, y:Float}));
trace((t2:TestPoint));
// trace((t1:TestPoint)); // fails as expected: SomePoint2<{ y : Float, x : Float }> should be TestPoint
}
}
注意:我觉得这个解决方案可以很容易地改进(两个 @:from
实现是相等的),但现在是凌晨 3 点,脑子里什么也没有。如果我最终弄清楚如何简化它,我会回来编辑它。
关于generics - 是否可以对类字段和属性使用 Haxe 类型约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33094772/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!