在#!/usr/bin/python3.6
from PyQt5.QtWidgets import (QMainWindow, QApplication, QFrame, QAction, qApp, QStackedWidget, QWidget, QListWidget, QVBoxLayout)
from PyQt5.QtGui import QIcon
import sys
class CharManMain(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
'''initiates application UI'''
exitAct = QAction('&Exit', self)
exitAct.setShortcut('Ctrl+Q')
exitAct.setStatusTip('Exit Application')
exitAct.triggered.connect(qApp.quit)
newAct = QAction('&New', self)
newAct.setShortcut('Ctrl+N')
newAct.setStatusTip('Create a New character')
openAct = QAction('&Open', self)
openAct.setShortcut('Ctrl+O')
openAct.setStatusTip('Open a saved character')
statusbar = self.statusBar()
menubar = self.menuBar()
fileMenu = menubar.addMenu('&File')
characterMenu = menubar.addMenu('Characters')
fileMenu.addAction(newAct)
fileMenu.addAction(openAct)
fileMenu.addAction(exitAct)
baseFrame = QFrame(self)
vbox = QVBoxLayout()
vbox.addWidget(menubar)
vbox.addWidget(baseFrame)
vbox.addWidget(statusbar)
self.setLayout(vbox)
self.setWindowTitle('Character Manager v0.01')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
charMain = CharManMain()
sys.exit(app.exec_())
和|
上作为方法存在单个管道“或” TrueClass
,但短路FalseClass
操作符不存在。它也不作为||
上的方法存在。
这似乎是ruby的“一切都是对象”隐喻的一个例外。
主要问题:从语法上讲,Object
和||
是什么?他们只是烘焙了一些全局语法吗?
次要问题:我将其标记为不是主要问题的一部分,因为它可能是主观的,尽管我怀疑可能不是。
是否存在这种不对称的语言设计或性能原因?在我看来,两个操作符都可以实现为&&
上的方法。像这样:
Object
我认为这是有原因的。什么事?
答案 0 :(得分:2)
|
和||
均为operators。 ||
是语言的一部分,而|
是某些类(Array
,FalseClass
,Integer
,NilClass
和{ {3}})。
在编程语言中,|
通常用作TrueClass
运算符。它组合其整数操作数的位并产生一个新的整数值。与非整数操作数一起使用时,某些语言会将它们转换为整数,而另一些则禁止此类用法。
||
是bitwise OR运算符。它合并两个布尔值(true
或false
),并生成另一个布尔值。当其操作数不是布尔值时,某些语言会将它们转换为布尔值。 Ruby(以及JavaScript和其他语言)将其第一个操作数评估为布尔值,如果其布尔值是true
,则表达式的值为其第一个操作数的值;如果其逻辑值是,则其值为第二个操作数的值第一个是false
。结果值的类型为其原始类型,不会转换为布尔值。
每种语言都使用自己的规则来决定将哪些非布尔值转换为false
(通常是数字0
,空字符串''
和null
或{ {1}});所有其他值都将转换为undefined
。 Ruby中唯一的“假”值是true
(布尔值)和false
(非布尔值);所有其他值(包括nil
)均为“ true”。
由于logical OR和true || anything
is true
,包括Ruby在内的许多编程语言都为逻辑表达式实现了短路评估。
使用false && anything
is false
,从左到右评估一个逻辑表达式,一次运算一个操作数,直到可以计算该表达式的值而无需计算其他运算数。在上面的示例中,0
的值不会更改整个表达式的值。使用短路评估,根本不会计算anything
的值,因为它不会影响整个表达式的值。由于anything
是一个需要花费大量时间才能执行的方法调用,因此短路评估避免了调用它并节省了执行时间。
正如其他人在对该问题的评论中已经提到的那样,无法将anything
作为某种类的方法来实现。必须对其第二个操作数的值进行求值,才能将其作为方法的参数传递,这会破坏短路行为。
在编程语言中,逻辑值的通常表示形式仅使用一位(我想Ruby也是如此)。||
和|
的结果对于存储在一位上的操作数是相同的。
Ruby使用||
符号来实现|
操作的不同形式,如下所示:
OR
的非短路bitwise OR; 像这样的表达式:
nil
确保对所有 如果 通过这种方法可以调用每个方法,而不管之前调用的方法返回什么值。 对于union, 另外,对于x = false | a | b | c
,a
和b
表达式进行求值(无短路),并且c
的值是逻辑或x
,a
和b
的逻辑值。
c
,a
和b
是方法调用,则使用逻辑OR 运算符(c
)来获得相同的结果,代码需要看起来像这样:||
TrueClass
和FalseClass
,当不需要短路评估时,aa = a
bb = b
cc = c
x = aa || bb || cc
运算符很有用。NilClass
(数组只是一个有序集合),|
运算符实现并集,该操作在语义上等效于集合的逻辑OR