我希望能够使用元数据来注释我的类型和方法,并在运行时读取它们.
语言参考解释了如何声明属性用法,但实际上是否可以声明自己的属性?
阅读需要某种反射机制,我根本无法在参考文献中找到,因此问题的第二部分可能是 - 是否有可能反思.如果Swift中没有这些功能,可以使用Objective-C代码(但在Swift实例和类型上)吗?
一个相对不相关的注释:已经建模为属性的决定以及添加到核心语法中的内容让我觉得非常武断.感觉两个不同的团队在语法和某些属性上工作.例如,他们把weak和unowned到语言作为修饰,但做@final和@lazy属性.我相信,一旦他们实际添加了访问修饰符,他们可能会喜欢属性final.所有这些都与Objective-C互操作性有关吗?
我们发现我们的Javascript代码的解释存在严重问题,这些代码仅发生在iOS 5/Safari 6(当时的iPad版本)上,我们认为这是由于Safari中的Just in Time JS编译器中的关键错误.(请参阅下面的更新,了解更多受影响的版本和现在似乎包含修复的版本).
我们最初在我们的库的在线演示中发现了这个问题:演示或多或少地随机崩溃,但这只是第二次(甚至更晚)发生相同代码的执行.即如果你运行一部分代码,一切正常,但后续运行会使应用程序崩溃.
有趣的是,在Chrome for iOS中执行相同的代码问题没有显示,我们认为这是由于Chrome for iOS中使用的Webview缺少JIT功能.
经过大量的摆弄,我们终于认为我们发现了至少一个有问题的代码:
var a = 0; // counter for index
for (var b = this.getStart(); b !== null; b = b.getNext()) // iterate over all cells
b.$f = a++; // assign index to cell and then increment
Run Code Online (Sandbox Code Playgroud)
本质上,这是一个简单的for循环,它将链表中的每个单元格分配给它的索引.这里的问题是循环体中的后增量操作.当前计数被分配给字段并在计算表达式后更新,基本上与首先分配a然后将其递增1相同.
这在我们测试的所有浏览器和Safari中的前几次都可以正常工作,然后突然看起来似乎计数器变量a首先递增,然后分配结果,就像预增量操作一样.
我创建了一个小提琴,显示了这里的问题:http://jsfiddle.net/yGuy/L6t5G/
在带有iOS 6的iPad 2上运行示例并且所有更新结果对于我的情况下的前两次运行是正常的,并且在第三次运行中突然显示列表中的最后一个元素具有指定的值,其中一个是关闭的(输出当你点击"点击我"按钮从"从0到500"变为"从0到501"时
有趣的是,如果你切换标签,或稍等一下,可能会发生突然结果是正确的两次左右的运行!似乎Safari有时重置是JIT缓存.
所以,因为我认为Safari团队可能需要很长时间来修复这个bug(我还没有报告),并且可能还有其他类似的错误,比如潜伏在JIT中同样难以找到的,我想知道是否有办法在Safari中禁用JIT功能.当然这会降低我们的代码(已经非常占用CPU),但速度比崩溃慢.
更新:不出所料,它不仅仅是受影响的后增量运算符,还有后减量运算符.更令人惊讶和更令人担忧的是,如果赋值,则没有区别,因此在现有代码中查找赋值是不够的.例如,下面的代码b.$f = (a++ % 2 == 0) ? 1 : 2;中,变量值未分配,但仅用于三元运算符条件,在某种意义上"失败",有时选择了错误的分支.目前看起来似乎只有在根本不使用邮政运营商时才能避免问题.
更新:同样的问题不仅存在于iOS设备中,而且存在于Safari 6中的 …
/** @param {Array.<MyClass>} myClasses An array of MyClass objects. */
TestClass.protoype.someMethod = function( myClasses ){
myClasses[0].aMethodOnMyClass();
}
Run Code Online (Sandbox Code Playgroud)
这使得像WebStorm这样的IDE中的代码完成实际上提供了正确的类型信息[0]..这适用于Array类型,但是我有自己的集合类型,我也想使用这个功能.问题是我找不到合适的语法(可能因为没有,但是).我希望能够以某种方式宣布我的课程如下:
/**
* @typeparam {T} the type parameter
* @constructor {Test2.<T>}
* */
Test2 = function(){};
/**
* @returns {T} a value of type T, where T is the generic type parameter of Test2
*/
Test2.prototype.getGenericValue = function(){}
Run Code Online (Sandbox Code Playgroud)
这个语法或功能不适用于我的IDE,这里没有列出,所以我想知道这个用例的语法是用于WebStorm还是任何其他JS创作工具.
在测试我们的Javascript库时,我认为我们在IE10(v10.0.9200.16519 - Windows 8 64位)Javascript实现中发现了严重的内存泄漏setInterval.
一个简单的测试用例表明,如果在作为参数传递的函数的闭包中捕获变量以供稍后执行,它似乎没有资格进行垃圾收集,即浏览器似乎仍然保留对函数的引用或至少关闭变量.
我们的测试用例setInterval只执行一次函数,然后清除间隔计时器,即一段时间后没有代码再运行,并且不再可以访问任何变量(据我所知,在此代码中没有引入全局变量,除了运行方法在onload),然而这一过程需要高达(取决于迭代次数)一半的存储器中的千兆字节.
有趣的是,如果我们使用这不会发生setTimeout,而不是方法(和问题并没有看起来在IE9存在,而Chrome,FF的当前版本).
在Windows 8上的IE10的新实例中运行它并打开任务管理器以查看内存使用情况.它将快速增长到350兆字节,并将在脚本执行后留在那里.
这是有问题的代码片段的重要部分:
// the function that when called multiple times will cause the leak in IE10
var eatMemory = function() {
var a = null; // the captured closure variable
var intervalId = setInterval(function() {
a = createBigArray(); // call a method that allocates a lot of memory
clearInterval(intervalId); // stop the interval timer
}, 100);
} …Run Code Online (Sandbox Code Playgroud) 我有一个客户需要将图表应用程序(很久以前在MFC中开发)转换为C#.该应用程序显示大型网络(大量图形元素),并允许用户通过图形UI编辑/操作数据.
我决定最好使用一个库而不是从scracth开发所有(所有图形对象/选择/工具/事件/等)
我正在寻找商业解决方案.
我发现有三个似乎非常成熟,我想知道是否有人使用它们并且可以写出他/她的意见:
谢谢Yaron
我有一个即将使用 ProGuard 进行混淆的库。“库模式”几乎适用于我的用例,即保留所有公共和受保护的类和类成员几乎没问题。然而,由于 Java 的可见性要求,一些成员不能成为包私有或私有的,因此它们是公共类,尽管它们不应该在库中。我希望对它们进行混淆,以更清楚地表明这些类不属于公共 api,并获得更好的混淆和更小的库 jar。有没有办法从proguard“保留”规则中排除某些项目而无需按名称指定每个项目(使用“!”)。理想情况下,我想用标记注释来注释这些类和成员,但据我所知,只能告诉 Proguard保留带有某些注释的项目。
当我浏览std::vectorcppreference.com并发现一个名为“成员类型”的部分时,我不明白这意味着什么。事实上,成员类型部分存在于stl库中容器的所有参考文档中。
有人可以帮助我理解这一点吗?
TypeScript 使用结构子类型,所以这实际上是可能的:
// there is a class
class MyClassTest {
foo():void{}
bar():void{}
}
// and a function which accepts instances of that class as a parameter
function someFunction(f:MyClassTest):void{
if (f){
if (!(f instanceof MyClassTest)) {
console.log("why")
}
}
}
// but it's valid to pass objects, which aren't in fact instances
// they just need to "look" the same, be "structural subtypes"
someFunction({foo(){}, bar(){}}) //valid!
Run Code Online (Sandbox Code Playgroud)
然而,作为实现提供者,someFunction我想真正禁止传递结构相似的对象,但我真的只想允许 MyClassTest 或其子类型的真实实例。我想至少对我自己的一些函数声明强制执行“名义类型”。
这可能吗?
背景:考虑传递给 API 的对象需要是该类型的情况,例如,因为它们是由工厂生产的,该工厂在该对象上设置了一些内部状态,并且该对象实际上有一个私有接口,期望按顺序someFunction存在才能正常工作。但是,我不想透露该私有接口(例如在打字稿定义文件中),但我希望如果有人传递假实现,它会成为编译器错误。具体示例:我希望打字稿编译器在这种情况下抱怨,即使我提供了所有成员,如下所示:
//OK for …Run Code Online (Sandbox Code Playgroud) (这是对这个答案的跟进.)
我正在尝试为现有的Javascript库构建一个打字稿定义文件.我遇到的困难与以下方面的组合有关:
这是我试图在lib.d.ts库定义文件中编译的代码:
declare module MyModule {
export class SomeClass<T> {
new(); // default (unnamed) constructor for SomeClass
static WithEnumValue: { // "named constructor" for SomeClass
new <T>(enumValue: MyModule.SomeClass.SomeEnum): SomeClass<T>;
};
}
export module SomeClass {
export enum SomeEnum { VALUE_A, B, C }
}
}
declare module OtherModule {
export interface OtherInterface {
foo<T>(inst: MyModule.SomeClass<T>);
}
}
Run Code Online (Sandbox Code Playgroud)
问题是泛型方法的声明foo中OtherModule.OtherInterface
使用上面的代码我得到了这个奇怪的编译器输出(使用tsc编译器0.9.1.1):
error TS2090: Generic type 'MyModule.SomeClass' requires 0 type argument(s).
显然很难用0类型参数声明泛型类型,因为 …
出于好奇,我试图static final int SIZE从任何拥有它的类中打印该字段.要获得"任何拥有它的课程",我只是试图获得所有课程.但我注意到它总是返回一个长度为0的数组.
医生说
如果此Class对象没有公共成员类或接口,则此方法返回长度为0的数组.如果此Class对象表示基本类型,数组类或void,则此方法还返回长度为0的数组
但是Object没有列为原语.对象在某种程度上被视为无效吗?
那么,我该如何
- 获取所有类的数组?
和
-为什么这不是为对象工作?
javascript ×3
typescript ×2
.net ×1
c# ×1
c++ ×1
c++11 ×1
d3.js ×1
diagram ×1
duck-typing ×1
flowchart ×1
java ×1
jit ×1
jsdoc ×1
memory-leaks ×1
proguard ×1
reflection ×1
safari ×1
safari6 ×1
stl ×1
swift ×1
vector ×1
webstorm ×1