PHP的一个局限是对象总是评估为true
.但是SplFileinfo
(和Symfony的子类UploadedFile
)表现不同:
$a = new ArrayIterator(); // or any other class
$b = new SplFileInfo(__FILE__); // file used is not important
if ($a) echo 'true'; // 'true'
if (!$a) echo 'false'; // nothing because $a is true
if ($b) echo 'true'; // 'true'
if (!$b) echo 'false'; // Catchable fatal error: Object of class
// SplFileInfo could not be converted to boolean
Run Code Online (Sandbox Code Playgroud)
这是一个错误吗?测试在5.3和5.4.也发生在SplFileObject
.可能的相关问题.和2011年的Symfony问题.
我期待以下比较给出错误:
var A = B = 0;
if(A == B == 0)
console.log(true);
else
console.log(false);
Run Code Online (Sandbox Code Playgroud)
但奇怪的是它会回归false
.
更奇怪的是,
console.log((A == B == 1));
Run Code Online (Sandbox Code Playgroud)
回报true
.
这种"三元"比较如何运作?
假设我有类似的东西
true && true #=> true
Run Code Online (Sandbox Code Playgroud)
这是有道理的,所以我尝试类似的东西:
true && "dsfdsf" #=> "dsfdsf"
Run Code Online (Sandbox Code Playgroud)
这让我感到惊讶,因为我经常会做类似的事情,if something && something
而且我一直认为那是评估为真,并且会回归真实.进一步的实验做的事情如下:
jruby-1.7.3 :009 > "ad" && "dsf"
=> "dsf"
jruby-1.7.3 :010 > "ad" && "sdfd" && nil
=> nil
jruby-1.7.3 :011 > "ad" && nil && "sdf"
=> nil
Run Code Online (Sandbox Code Playgroud)
如果全部为真,或者它找到的第一个假值,Ruby似乎返回最后一个值.为什么这样做?这是一个正确的心理模型吗?
我一直在阅读有关JavaScript吊装的消息.
Ben Cherry的JavaScript范围和吊装
Dmitry Soshnikov关于"吊装"的两个词
而且,更多关于JavaScript类型强制,真假测试: 真理,平等和JavaScript以及其他一些资源
在练习一些时,发现我遗漏了一些关于吊装的重要概念和一个变量'truthy&falsy.
var foo = 1;
function bar() {
if (!foo) {
alert('inside if');
var foo = 10;
}
}
bar();
Run Code Online (Sandbox Code Playgroud)
O/P: inside if
怀疑: 'foo'值为'1',if(!foo)
应该评估false
并且不应该执行该块(引用来自上面的资源:提升仅影响var
&function
声明,但不影响执行).但为什么会显示该警报.如果我直接使用就不是这种情况false
(如下面的no-tricks代码所示:代码片段#3)
var foo = 1;
function bar() {
if (!foo) {
alert('inside if');
}
}
bar();
Run Code Online (Sandbox Code Playgroud)
o/p:没有输出; 意味着控制没有进入'如果'块
这是人们可以期待的
var foo = 1;
function bar() {
if (false) {
alert('inside if');
var foo = …
Run Code Online (Sandbox Code Playgroud) 我经常在我的Javascript中使用以下模式:
x = couldBeNullThing || valueIfItIsNull;
Run Code Online (Sandbox Code Playgroud)
因为它胜于:
x = couldBeNullThing ? couldBeNullThing : valueIfItIsNull;
Run Code Online (Sandbox Code Playgroud)
我也经常使用相同模式的轻微变体:
x = x || valueIfXIsNotDefined;
Run Code Online (Sandbox Code Playgroud)
这一切都很棒...除了问题,我最近发现:
foo = "";
//assert foo.x === undefined;
foo.x = foo.x || valueIfXIsNotDefined;
//assert foo.x === undefined;
Run Code Online (Sandbox Code Playgroud)
换句话说,如果你有一个字符串,你就做了string.aPropertyThatStringDoesntHave || foo,你既不会回头也不会回到实际价值; 相反,你得到了未定义.
谁能解释为什么会这样?在我看来,如果foo.x未定义,那么foo.x || anythingElse应该总是导致任何东西......所以为什么不呢?
考虑以下代码:
test_string = 'not empty'
if test_string:
return True
else:
return False
Run Code Online (Sandbox Code Playgroud)
我知道我可以构造一个条件表达式来做到这一点:
return True if test_string else False
Run Code Online (Sandbox Code Playgroud)
但是,当我宁愿返回布尔值时,我不喜欢测试布尔值是真还是假.我怎么才能恢复它的真实性?
这个问题的答案和讨论刺激了这个问题.以下代码段显示了问题的关键:
>>> bool(NotImplemented)
True
Run Code Online (Sandbox Code Playgroud)
我的问题如下:
bool
价值NotImplemented
应该是True
?它感觉是unpythonic.推理为什么我认为它不直观(请忽略缺乏最佳实践):
>>> class A:
... def something(self):
... return NotImplemented
...
>>> a = A()
>>> a.something()
NotImplemented
>>> if a.something():
... print("this is unintuitive")
...
this is unintuitive
Run Code Online (Sandbox Code Playgroud)
具有如此负面含义(缺乏实施)的东西似乎是一种奇怪的行为.
相关文字来自:
未实现
这应该由二进制特殊的方法被返回(如特殊的值
__eq__()
,__lt__()
,__add__()
,__rsub__()
,等等),以指示该操作不相对于另一种类型的实施; 可通过就地二进制特殊的方法(例如被返回__imul__()
,__iand__()
为了相同的目的,等等).它的真实价值是真实的.- 来自Python Docs
为了澄清我的立场,我觉得NotImplemented
能够评估一个布尔值本身就是一种反模式.我觉得Exception更有意义,但流行的想法是在评估不同对象之间的比较时,出于性能原因选择常量单例.我想我正在寻找令人信服的理由,为什么这是选择的"方式".
是否有约定表明 YARD 样式文档中的参数仅用于其“真实性”状态,即您只想知道它是否false
真实nil
?
Truthy
下面通常用什么来代替?
# @param [String] name
# @param [Truthy] admin_status
def create_user(name, admin_status)
# code goes here
end
Run Code Online (Sandbox Code Playgroud)
我在文档中找到的最接近的是布尔值,这并不是我真正想要的。
我知道一个空字符串在javascript中是假的,而一个非空字符串在javascript中是真的.
但是,为什么'false'
javascript 中的truthy,规范中是否有任何明确的内容?是性能问题还是存在您希望字符串'false'
表示的情况true
?
以下将打印'ok'
:
if 5:
print('ok')
Run Code Online (Sandbox Code Playgroud)
然而当我这样做时:
print(5 == True)
Run Code Online (Sandbox Code Playgroud)
输出是False
.
字符串也会发生同样的事情.为什么?
truthiness ×10
boolean ×4
javascript ×4
python ×3
ruby ×2
string ×2
casting ×1
comparison ×1
evaluation ×1
hoisting ×1
php ×1
python-3.x ×1
spl ×1
yard ×1