在我查看值的索引的通用数据结构之前,我想看看它是否this
已经参数化的类型的实例.
但是当我这样做时Eclipse会抱怨:
@Override
public int indexOf(Object arg0) {
if (!(arg0 instanceof E)) {
return -1;
}
Run Code Online (Sandbox Code Playgroud)
这是错误消息:
无法对类型参数E执行instanceof检查.请改为使用其擦除对象,因为泛型类型信息将在运行时被擦除
有什么更好的方法呢?
我正在使用Python,每当我必须验证函数输入时,我认为输入有效,然后发现错误.
就我而言,我有一个通用Vector()
类,我用它来做一些不同的事情,其中一个是补充.它既可以作为Color()
类也可以作为a Vector()
,因此当我向其添加标量时Color()
,它应该将该常量添加到每个单独的组件中.Vector()
和Vector()
添加所需的组分添加.
此代码用于光线跟踪器,因此任何速度提升都很棒.
这是我Vector()
班级的简化版本:
class Vector:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
def __add__(self, other):
try:
return Vector(self.x + other.x, self.y + other.y, self.z + other.z)
except AttributeError:
return Vector(self.x + other, self.y + other, self.z + other)
Run Code Online (Sandbox Code Playgroud)
我目前正在使用这种try...except
方法.有人知道更快的方法吗?
编辑:由于答案,我尝试并测试了以下解决方案,在添加Vector()
对象之前专门检查类名:
class Vector:
def __init__(self, x, y, z):
self.x = x
self.y = y …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用CarrierWave在Rails 3中使用图像播种数据库,但是我尝试的任何内容似乎都无法手动上传它们.
pi = ProductImage.new(:product => product)
pi.image = File.open(File.join(Rails.root, 'test.jpg'))
pi.store_image! # tried with and without this
product.product_images << pi
product.save!
Run Code Online (Sandbox Code Playgroud)
有人知道如何使用CarrierWave种子吗?
将Scala 2.7.7(最后的2.7.x版本)与Scala 2.8.1(最新的2.8.x版本)进行比较,我收集了以下指标:
Scala version | 2.7.7 2.8.1
------------------------------------------------
Compressed jar file | 3.6 MB 6.2 MB
Uncompressed files | 8.3 MB 16.5 MB
.class files in . | 1.8 MB 1.7 MB
in ./actors | 554.0 KB 1.3 MB
in ./annotation | 962 B 11.7 KB
in ./collection | 2.8 MB 8.8 MB
in ./compat | 3.8 3B 3.8 KB
in ./concurrent | 107.3 KB 228.0 KB
in ./io | 175.7 KB 210.6 KB
in …
Run Code Online (Sandbox Code Playgroud) 我知道,类型检查函数参数在Python中通常是不受欢迎的,但我认为我已经提出了这样做的情况.
在我的项目中,我有一个抽象基类Coord
,有一个子类Vector
,它有更多的功能,如旋转,变化幅度等.数字的列表和元组也将返回True,因为isinstance(x, Coord).
我还有许多函数和方法接受这些Coord类型作为参数.我已经设置了装饰器来检查这些方法的参数.这是一个简化版本:
class accepts(object):
def __init__(self, *types):
self.types = types
def __call__(self, func):
def wrapper(*args):
for i in len(args):
if not isinstance(args[i], self.types[i]):
raise TypeError
return func(*args)
return wrapper
Run Code Online (Sandbox Code Playgroud)
这个版本非常简单,它仍然有一些bug.它就是为了说明这一点.它将被用作:
@accepts(numbers.Number, numbers.Number)
def add(x, y):
return x + y
Run Code Online (Sandbox Code Playgroud)
注意:我只是针对Abstract Base Classes检查参数类型.
这是一个好主意吗?有没有更好的方法来做到这一点,而不必在每个方法中重复类似的代码?
编辑:
如果我要做同样的事情,但不是事先在装饰器中检查类型,我会在装饰器中捕获异常:
class accepts(object):
def __init__(self, *types):
self.types = types
def __call__(self, func):
def wrapper(*args):
try:
return func(*args)
except TypeError:
raise TypeError, message
except AttributeError:
raise AttributeError, message
return wrapper …
Run Code Online (Sandbox Code Playgroud) 类型系统经常受到批评,因为它是限制性的,即限制编程语言并禁止程序员编写有趣的程序.
Chris Smith 声称:
我们确保程序是正确的(在这种类型检查器检查的属性中),但反过来我们必须拒绝一些有趣的程序.
和
此外,还有一个铁定的数学证明,任何利益的类型检查器总是保守的.构建一个不拒绝任何正确程序的类型检查器并不困难; 不可能.
有人可以概述一下这可能是什么样的有趣程序吗?哪里证明类型检查器必须保守?
更一般:类型检查和类型系统的限制是什么?
有很多关于MooseX :: Method :: Signatures的讨论,甚至在此之前,像Params :: Validate这样的模块设计用于检查方法或函数的每个参数.我正在考虑使用前者用于我未来的所有Perl代码,无论是个人还是我的工作地点.但我不确定这是否值得付出努力.
我正在考虑我之前看过(和写过)的所有Perl代码,之后不执行此类检查.我很少看到一个模块这样做:
my ($a, $b) = @_;
defined $a or croak '$a must be defined!';
!ref $a or croak '$a must be a scalar!";
...
@_ == 2 or croak "Too many arguments!";
Run Code Online (Sandbox Code Playgroud)
也许是因为没有某种辅助模块它只是太多的工作,但也许是因为在实践中我们不会向函数发送过多的参数,而且我们不会将arrayref发送到期望标量的方法 - 或者如果我们这样做,我们就会use warnings;
和我们很快就听到了 - 鸭子打字的方法.
那么Perl类型的检查是否值得追求性能,或者它的优势主要体现在编译的强类型语言(如C或Java)中?
我对任何有使用这些模块并且已经看到使用它们的好处(或没有)的Perl编写经验的人的答案感兴趣; 如果您的公司/项目有任何与类型检查有关的政策; 以及类型检查和性能方面的任何问题.
更新:我最近读了一篇关于这个主题的有趣文章,称为强测试与强打字.忽略轻微的Python偏见,它实质上表明在某些情况下类型检查可能会令人窒息,即使您的程序通过了类型检查,也无法保证正确性 - 正确的测试是唯一可靠的方法.
我知道我无法从一个int派生而且甚至没有必要,这只是我想到的下面问题的一个(非)解决方案.
我有一对(foo,bar)
都由内部代表,int
但我希望它typeof(foo)
是无与伦比的typeof(bar)
.这主要是为了防止我传递(foo,bar)
给期望的函数(bar, foo)
.如果我理解正确,typedef
不会这样做,因为它只是一个别名.最简单的方法是什么?如果我要创建两个不同的类foo
,bar
那么显式提供所有支持的运算符将是繁琐的int
.我想避免这种情况.
鉴于以下内容:
> (liftM2 fromMaybe) (ioError $ userError "OOPS") (return $ Just "ok")
Run Code Online (Sandbox Code Playgroud)
ghci给了我
*** Exception: user error (OOPS)
Run Code Online (Sandbox Code Playgroud)
当然,来自Maybe的工作正常:
> (liftM2 fromMaybe) (return $ "not me") (return $ Just "ok")
"ok"
Run Code Online (Sandbox Code Playgroud)
但似乎IO操作正在执行然后被丢弃:
> (liftM2 fromMaybe) (putStrLn "computing.." >> "discarded") (return $ Just "ok")
computing..
"ok"
Run Code Online (Sandbox Code Playgroud)
为什么会这样?有没有什么方法可以让IO Monad更加懒散?
具体来说,考虑value :: IO (Maybe a)
到(简洁,简洁)的说法
result <- (liftM2 fromMaybe) err value
Run Code Online (Sandbox Code Playgroud)
并解压缩结果或相应地抛出IOError?
typechecking ×7
performance ×2
python ×2
ruby ×2
types ×2
c++ ×1
carrierwave ×1
generics ×1
haskell ×1
idioms ×1
instanceof ×1
io ×1
java ×1
maybe ×1
monads ×1
moose ×1
perl ×1
rake ×1
scala ×1
seed ×1
type-systems ×1