我对Ruby很陌生,对三元运算符?:的工作方式有些困惑。
根据工程软件即服务:一种基于云计算的敏捷方法一书
每个操作都是对某个对象的方法调用,并返回一个值。
从这个意义上说,如果三元操作符表示一个操作,那么它就是对带有两个参数的对象的方法调用。但是,我找不到三元操作符在鲁比文档中表示的任何方法。三元操作符是否表示Ruby中的操作?书中提到的上述说法是否有误?Ruby中的三元运算符真的只是if ... then ... else ... end语句的语法糖吗?
请注意:我的问题与如何在Ruby中使用条件运算符(?:)?有关,但与那个问题不一样。我知道如何按照那篇文章中描述的方式使用三元操作符。我的问题是在Ruby中定义三元操作符的位置,以及是否将三元操作符定义为一个或多个方法。
发布于 2018-08-26 04:25:23
红宝石中的三值运算符真的只是一种语法糖吗?然后..。否则..。结束语?
是。
来自doc/syntax/control_expressions.rdoc
您还可以使用
?和:编写if-然后-else表达式。这个三元的如果: input_type = gets =/ /hello/i?“问候”:“其他” 与此if表达式相同: 根据本书,“每个操作都是对某个对象的方法调用,并返回一个值。”从这个意义上说,如果三元操作符表示一个操作,那么它就是对一个带有两个参数的对象的方法调用。
if、unless、while和until不是操作符,它们是控制结构。它们的修饰符版本出现在运算符优先表中,因为它们需要优先级才能被解析。他们只是检查他们的状况是正确的还是错误的。在Ruby中,这很简单,只有false和nil是假的。其他的都是真的。
运算符类似于!、+、*和[]。他们是一元或二进制。您可以通过对各种对象调用.methods.sort来查看它们的列表。例如..。
2.4.3 :004 > 1.methods.sort
=> [:!, :!=, :!~, :%, :&, :*, :**, :+, :+@, :-, :-@, :/, :<, :<<, :<=, :<=>, :==, :===, :=~, :>, :>=, :>>, :[], :^, :__id__, :__send__, etc...发布于 2018-08-27 07:50:38
Ruby中的三元运算符真的只是
if ... then ... else ... end语句的语法糖吗?
(另一) yes。
下面是a ? b : c的解析树
$ ruby --dump=parsetree -e 'a ? b : c'
###########################################################
## Do NOT use this node dump for any purpose other than ##
## debug and research. Compatibility is not guaranteed. ##
###########################################################
# @ NODE_SCOPE (line: 1)
# +- nd_tbl: (empty)
# +- nd_args:
# | (null node)
# +- nd_body:
# @ NODE_PRELUDE (line: 1)
# +- nd_head:
# | (null node)
# +- nd_body:
# | @ NODE_IF (line: 1)
# | +- nd_cond:
# | | @ NODE_VCALL (line: 1)
# | | +- nd_mid: :a
# | +- nd_body:
# | | @ NODE_VCALL (line: 1)
# | | +- nd_mid: :b
# | +- nd_else:
# | @ NODE_VCALL (line: 1)
# | +- nd_mid: :c
# +- nd_compile_option:
# +- coverage_enabled: false下面是if a then b else c end的解析树
$ ruby --dump=parsetree -e 'if a then b else c end'
###########################################################
## Do NOT use this node dump for any purpose other than ##
## debug and research. Compatibility is not guaranteed. ##
###########################################################
# @ NODE_SCOPE (line: 1)
# +- nd_tbl: (empty)
# +- nd_args:
# | (null node)
# +- nd_body:
# @ NODE_PRELUDE (line: 1)
# +- nd_head:
# | (null node)
# +- nd_body:
# | @ NODE_IF (line: 1)
# | +- nd_cond:
# | | @ NODE_VCALL (line: 1)
# | | +- nd_mid: :a
# | +- nd_body:
# | | @ NODE_VCALL (line: 1)
# | | +- nd_mid: :b
# | +- nd_else:
# | @ NODE_VCALL (line: 1)
# | +- nd_mid: :c
# +- nd_compile_option:
# +- coverage_enabled: false他们是一样的。
在许多语言中,?:是表达式,而if-then-else是语句。在Ruby中,两者都是表达式。
https://stackoverflow.com/questions/52022945
复制相似问题