首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >三元操作符?:在Ruby中定义为方法吗?

三元操作符?:在Ruby中定义为方法吗?
EN

Stack Overflow用户
提问于 2018-08-26 03:25:24
回答 2查看 1.3K关注 0票数 2

我对Ruby很陌生,对三元运算符?:的工作方式有些困惑。

根据工程软件即服务:一种基于云计算的敏捷方法一书

每个操作都是对某个对象的方法调用,并返回一个值。

从这个意义上说,如果三元操作符表示一个操作,那么它就是对带有两个参数的对象的方法调用。但是,我找不到三元操作符在鲁比文档中表示的任何方法。三元操作符是否表示Ruby中的操作?书中提到的上述说法是否有误?Ruby中的三元运算符真的只是if ... then ... else ... end语句的语法糖吗?

请注意:我的问题与如何在Ruby中使用条件运算符(?:)?有关,但与那个问题不一样。我知道如何按照那篇文章中描述的方式使用三元操作符。我的问题是在Ruby中定义三元操作符的位置,以及是否将三元操作符定义为一个或多个方法。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-08-26 04:25:23

红宝石中的三值运算符真的只是一种语法糖吗?然后..。否则..。结束语?

是。

来自doc/syntax/control_expressions.rdoc

您还可以使用?:编写if-然后-else表达式。这个三元的如果: input_type = gets =/ /hello/i?“问候”:“其他” 与此if表达式相同: 根据本书,“每个操作都是对某个对象的方法调用,并返回一个值。”从这个意义上说,如果三元操作符表示一个操作,那么它就是对一个带有两个参数的对象的方法调用。

ifunlesswhileuntil不是操作符,它们是控制结构。它们的修饰符版本出现在运算符优先表中,因为它们需要优先级才能被解析。他们只是检查他们的状况是正确的还是错误的。在Ruby中,这很简单,只有falsenil是假的。其他的都是真的。

运算符类似于!+*[]。他们是一元二进制。您可以通过对各种对象调用.methods.sort来查看它们的列表。例如..。

代码语言:javascript
复制
2.4.3 :004 > 1.methods.sort
 => [:!, :!=, :!~, :%, :&, :*, :**, :+, :+@, :-, :-@, :/, :<, :<<, :<=, :<=>, :==, :===, :=~, :>, :>=, :>>, :[], :^, :__id__, :__send__, etc...

注意,在Ruby大量借用的小谈话中,所有东西实际上都是一个方法调用。包括控制结构

票数 8
EN

Stack Overflow用户

发布于 2018-08-27 07:50:38

Ruby中的三元运算符真的只是if ... then ... else ... end语句的语法糖吗?

(另一) yes

下面是a ? b : c的解析树

代码语言:javascript
复制
$ 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的解析树

代码语言:javascript
复制
$ 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中,两者都是表达式。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52022945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档