||和&&不是对象上的方法-它们是什么?

时间:2018-07-04 15:45:58

标签: ruby

#!/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

我认为这是有原因的。什么事?

1 个答案:

答案 0 :(得分:2)

|||均为operators||是语言的一部分,而|是某些类(ArrayFalseClassIntegerNilClass和{ {3}})。

在编程语言中,|通常用作TrueClass运算符。它组合其整数操作数的位并产生一个新的整数值。与非整数操作数一起使用时,某些语言会将它们转换为整数,而另一些则禁止此类用法。

||bitwise OR运算符。它合并两个布尔值(truefalse),并生成另一个布尔值。当其操作数不是布尔值时,某些语言会将它们转换为布尔值。 Ruby(以及JavaScript和其他语言)将其第一个操作数评估为布尔值,如果其布尔值是true,则表达式的值为其第一个操作数的值;如果其逻辑值是,则其值为第二个操作数的值第一个是false。结果值的类型为其原始类型,不会转换为布尔值。

每种语言都使用自己的规则来决定将哪些非布尔值转换为false(通常是数字0,空字符串''null或{ {1}});所有其他值都将转换为undefined。 Ruby中唯一的“假”值是true(布尔值)和false(非布尔值);所有其他值(包括nil)均为“ true”。

由于logical ORtrue || anything is true,包括Ruby在内的许多编程语言都为逻辑表达式实现了短路评估

使用false && anything is false,从左到右评估一个逻辑表达式,一次运算一个操作数,直到可以计算该表达式的值而无需计算其他运算数。在上面的示例中,0的值不会更改整个表达式的值。使用短路评估,根本不会计算anything的值,因为它不会影响整个表达式的值。由于anything是一个需要花费大量时间才能执行的方法调用,因此短路评估避免了调用它并节省了执行时间。

正如其他人在对该问题的评论中已经提到的那样,无法将anything作为某种类的方法来实现。必须对其第二个操作数的值进行求值,才能将其作为方法的参数传递,这会破坏短路行为。

在编程语言中,逻辑值的通常表示形式仅使用一位(我想Ruby也是如此)。|||的结果对于存储在一位上的操作数是相同的。

Ruby使用||符号来实现|操作的不同形式,如下所示:

像这样的表达式:

nil

确保对所有x = false | a | b | c ab表达式进行求值(无短路),并且c的值是逻辑或x,ab的逻辑值。

如果cab是方法调用,则使用逻辑OR 运算符(c)来获得相同的结果,代码需要看起来像这样:

||

通过这种方法可以调用每个方法,而不管之前调用的方法返回什么值。

对于unionTrueClassFalseClass,当不需要短路评估时,aa = a bb = b cc = c x = aa || bb || cc 运算符很有用。

另外,对于NilClass(数组只是一个有序集合),|运算符实现并集,该操作在语义上等效于集合的逻辑OR