看一下NSArray.h中的NSArray创建方法块.
返回id的方法是否有正当理由不返回instancetype?
Apple甚至努力添加内联注释,让我们知道id在这种情况下会返回一个NSArray.
@interface NSArray (NSArrayCreation)
+ (instancetype)array;
+ (instancetype)arrayWithObject:(id)anObject;
+ (instancetype)arrayWithObjects:(const id [])objects count:(NSUInteger)cnt;
+ (instancetype)arrayWithObjects:(id)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
+ (instancetype)arrayWithArray:(NSArray *)array;
- (instancetype)init; /* designated initializer */
- (instancetype)initWithObjects:(const id [])objects count:(NSUInteger)cnt; /* designated initializer */
- (instancetype)initWithObjects:(id)firstObj, ... NS_REQUIRES_NIL_TERMINATION;
- (instancetype)initWithArray:(NSArray *)array;
- (instancetype)initWithArray:(NSArray *)array copyItems:(BOOL)flag;
+ (id /* NSArray * */)arrayWithContentsOfFile:(NSString *)path;
+ (id /* NSArray * */)arrayWithContentsOfURL:(NSURL *)url;
- (id /* NSArray * */)initWithContentsOfFile:(NSString *)path;
- (id /* NSArray * */)initWithContentsOfURL:(NSURL *)url;
@end
Run Code Online (Sandbox Code Playgroud)
我能提出这些特殊方法的唯一方法就是Apple的这个指导 …
我来自Java世界,我想知道在编译代码时除了缺少错误外,Python中的动态类型有什么好处?
你喜欢Python的打字吗?你有一个例子,它在一个大项目中有所帮助吗?是不是有点容易出错?
我想用这种类型的签名编写一个函数:
getTypeRep :: Typeable a => t a -> TypeRep
Run Code Online (Sandbox Code Playgroud)
其中TypeRep将是类型表示为一个,而不是为TA.也就是说,编译器应该随时调用位置[自动返回正确的类型表示getTypeRep ],这将有具体的类型一个.
要添加一些上下文,我想创建一个"动态类型"数据类型,其扭曲是它将记住顶级类型,但不记住它的参数.例如,我想将MyClass a转换为Dynamic MyClass,上面的函数将用于创建Dynamic MyClass的实例,用于存储类型参数a的表示.
由于python是动态类型的,当然我们可以这样做:
def f(x):
return 2 if x else "s"
Run Code Online (Sandbox Code Playgroud)
但实际上是否打算使用python的方式?或换句话说,联盟类型是否存在于他们在球拍中的意义上?或者我们只使用它们:
def f(x):
if x:
return "x"
Run Code Online (Sandbox Code Playgroud)
我们需要的唯一"联盟"是什么?
我希望能够提供一个带有类型元组的函数,然后将其用于反序列化从事务中返回的数据。如果事务成功,该函数将返回这些类型的实例。例如:
T = TypeVar('T')
class Base:
@classmethod
def deserialize(cls: Type[T], bts: bytes) -> T:
return cls(**json.loads(bts))
@classmethod
def transaction(cls, *types):
items = self.db.transact([t.generate_load_operation() for t in types])
items = [t.deserialize(item) for item in items]
# how do I type-hint transaction, so that it would imply that
# it will always return a tuple (or a list) of instances of classes
# contained in variable types?
return items
class A(Base):
pass
class B(Base):
pass
a_inst, b_inst = Base.transaction(A, B)
Run Code Online (Sandbox Code Playgroud)
我应该如何注释事务,以便类型检查器可以正确推断从它返回的值的类型?
我正在使用Groovy语言,它具有动态类型(以及可选的静态类型).它还具有对列表,地图和范围的本机支持,因此我发现自己使用列表和地图很多,尤其是列表列表,地图列表,列表地图等.
在静态语言(尤其是泛型)中,您始终可以了解您的类型.我对动态语言相当新,而且跟踪我的变量应该是什么有点困难,所以我想知道其他人是否使用某种变量命名约定来保持这些.
例如,假设我有一个日期为键的映射,而整数为值.或整数列表,或包含字符串作为键和帐户对象作为值的映射列表.
似乎在变量名后面创建一个明确的约定将帮助我跟踪我正在处理的数据类型结构,而不必查找它.
有小费吗?
language-agnostic variables groovy naming-conventions dynamic-typing
如果Prolog在字符串,数字,原子,列表和复合结构之间有明确的区别,那么它如何被称为无类型.它与动态类型语言(如Lisp)有何不同.
Prolog与"动态类型语言"定义的哪一部分相冲突?Lisp与"无类型语言"的定义中哪一部分冲突?
任何见解都表示赞赏.
更新
我已经知道动态,静态,强弱打字之间的区别.我的问题是关于Prolog的一个特例.我只想了解Prolog如何被认为是无类型的,尽管它似乎与动态类型语言没有明显区别.
这是Prolog无类型的参考 http://en.wikipedia.org/wiki/Prolog#Types
好的,首先要解决这个问题:我已经阅读了以下答案:
但我真的不明白它的答案.
在像Python这样的语言中,表达式为:
x = a + b
Run Code Online (Sandbox Code Playgroud)
无法真正编译,因为"编译器"不可能知道a和b的类型(因为类型只在运行时知道),因此如何添加它们.
这就是使Python这样的语言在没有类型声明的情况下无法编译的原因,对吗?通过声明,编译器知道例如a和b是整数,因此知道如何添加它们,并将其转换为本机代码.
那怎么做:
(setq x 60)
(setq y 40)
(+ x y)
Run Code Online (Sandbox Code Playgroud)
工作?
编译被定义为本机提前编译.
编辑
实际上,这个问题更多的是关于是否可以编译没有类型声明的动态语言,如果是,如何编译?
编辑2
经过大量研究(即狂热的维基百科浏览),我想我理解以下内容:
如果我在上述任何一点上错了,请纠正我.
我正在尝试使用动态类型实现玩具语言,即变量没有类型,只有值,并且每个变量在使用之前都需要声明.例如,代码可能看起来像var x; x = 3; x = 'a';.此外,我想将这种玩具语言编译为本机代码,而不是在某些虚拟机中运行它.
目前,我已经生成了一个AST,我将使用LLVM C++ API将AST编译为LLVM IR.问题是,我应该生成什么样的IR
var x;或var y = 3.4;ain c = a + 1)compiler-construction compilation llvm dynamic-typing llvm-ir
我的Java类代表数据库中的实体,我发现覆盖equals我的类的方法以通过id进行比较是切实可行的.所以例如在我的Transaction课堂上我有这段代码
@Override
public boolean equals(Object other){
if (other == null) return false;
if (other == this) return true;
if (!(other instanceof Transaction))return false;
Transaction otherTrans = (Transaction) other;
if (id == null || otherTrans.id == null) return false;
return id.equals(otherTrans.id);
}
Run Code Online (Sandbox Code Playgroud)
现在,对我来说似乎有点难看,每个类都拥有相同的代码片段,只更改了类的名称.我想让我的类扩展一个超类MyEntity,我会编写上面的方法,替换instanceof Transaction为类似的东西instanceof this.getClass(),但这似乎不可能.我也想过用它代替它instanceof MyEntity,但这意味着两个对象可以被认为是相等的,即使它们属于不同的类,只要它们具有相同的id.还有其他方法吗?
dynamic-typing ×10
types ×3
java ×2
lisp ×2
python ×2
compilation ×1
groovy ×1
haskell ×1
instanceof ×1
ios ×1
iphone ×1
llvm ×1
llvm-ir ×1
objective-c ×1
prolog ×1
python-3.x ×1
typeclass ×1
unions ×1
variables ×1