ruby 关键字“if”是什么对象类型/类?

z3yyvxxp  于 12个月前  发布在  Ruby
关注(0)|答案(3)|浏览(101)

如果单词truefalse是布尔值,引号内的任何东西都是字符串的(“嘿”),那么什么对象类型/类/等。是ifelsifunless
这个问题不一定是Ruby特有的,尽管我对Ruby的语法更熟悉。

nbnkbykc

nbnkbykc1#

if是一个Control Expression(不太具体地说是一个关键字)。
这些都是语言级别的结构, Bootstrap 的流程,就像Ruby中的其他控制结构(elseelsifcase等)一样,if不能被传递,它的值是计算表达式的结果。
它没有类型或类,因为它不是值。

tyu7yeag

tyu7yeag2#

这个问题毫无意义。(我不是说这是对提问者的侮辱,而是这个词的技术意义。
当你阅读一本书时,故事是通过在你的脑海中“解释”页面上的句子而创造出来的。但这一页上的句子并不是故事。这就像问哈利波特书中的“如果”是哪个角色一样。它不是,它只是用来写故事的英语语法的一部分。
这就是我所说的“无意义”:这是一个 * 类别错误 *。
if是一个关键字。关键字是一个特殊的语法结构,它允许解析器更容易地解析程序的语法。这就是它的全部。它是语言语法结构的一部分,而不是运行程序中的值。
一些(但不是所有)关键字,或者更准确地说,由这些关键字形成的表达式,具有特定的 * 语义 *(含义)。
例如表述

if some_condition then some_consequence else another_consequence end

# can also be written as

if some_condition; some_consequence else another_consequence end

# can also be written as

if some_condition
some_consequence else another_consequence end

# but is most commonly written as

if some_condition
  some_consequence
else
  another_consequence
end

大致有以下语义:
1.计算表达式some_condition
1.让C表示该评估的结果值。
1.执行以下步骤之一:
1.如果Ctruthy,即C不是两个特殊值nilfalse之一:
1.计算表达式some_consequence
1.让R表示该评估的结果值。
1.如果Cfalsey,即C是两个特殊值nilfalse之一:
1.计算表达式another_consequence
1.让R表示该评估的结果值。
1.计算整个条件表达式的结果值是R

Aside:这是在哪里定义的?

不幸的是,与许多其他编程语言不同,Ruby语言规范并不作为一个文档存在于一个地方。Ruby没有一个正式的规范来定义某些语言结构的含义。
有几个资源,其中的 * 总和 * 可以被认为是Ruby编程语言的规范。
这些资源包括:

  • ISO/IEC 30170:2012 Information technology — Programming languages — Ruby specification-请注意,ISO Ruby规范是在2009-2010年左右编写的,其特定目标是当时所有现有的Ruby实现都可以轻松兼容。由于YARV和MacRuby只实现了Ruby 1.9+,MRI只实现了Ruby 1.8及更低版本,JRuby、XRuby、Ruby.NET和IronRuby(当时)只实现了Ruby 1.8的一个子集,这意味着ISO Ruby规范只包含Ruby 1.8和Ruby 1.9共同的功能。此外,ISO Ruby规范的目的是最小化,只包含编写Ruby程序绝对需要的功能。正因为如此,例如,它只指定了非常广泛的String s(因为它们在Ruby 1.8和Ruby 1.9之间发生了重大变化)。它显然也没有指定在ISO Ruby规范编写之后添加的功能,例如Ractors或Pattern Matching。
  • The Ruby Spec Suite aka ruby/spec-请注意,ruby/spec还远远没有完成。然而,我非常喜欢它,因为它是用Ruby而不是“ISO标准”编写的,这对于Rubyist来说更容易阅读,而且它也是一个可执行的一致性测试套件。
  • The Ruby Programming Language by David Flanagan and Yukihiro 'matz' Matsumoto-这本书是由大卫弗拉纳根和Ruby的创造者matz一起写的,作为Ruby的语言参考。
  • Programming Ruby by Dave Thomas, Andy Hunt, and Chad Fowler-这本书是第一本关于Ruby的英文书,并且在很长一段时间内作为Ruby的标准介绍和描述。这本书还首次记录了Ruby核心库和标准库,作者将这些文档捐赠给了社区。
  • Ruby Issue Tracking System,特别是Feature sub-tracker-然而,请注意,不幸的是,社区在区分关于Ruby编程语言的Ticket和关于YARV Ruby实现的Ticket方面非常非常糟糕:它们都被混在追踪器里了
  • Ruby Developer Meetings的会议日历。(同样的问题:Ruby和YARV混合在一起。
  • mailing lists上经常讨论新功能,特别是ruby-core (English)ruby-dev (Japanese)邮件列表。(同样的问题再次出现)。
  • Ruby documentation--再次提醒,本文档是从YARV的源代码生成的,并没有区分Ruby的特性和YARV的特性。
  • 在过去,有几次尝试对Ruby规范进行形式化更改,例如Ruby Change Request (RCR)Ruby Enhancement Proposal (REP)过程,但都没有成功。
  • 如果所有这些都失败了,您需要检查流行的Ruby实现的源代码,看看它们实际上是做什么的。请注意复数:您必须查看多个(理想情况下是所有)实现,以确定共识是什么。只看一个实现 * 不可能告诉你 * 你正在看的是这个特定实现的一个实现怪癖,还是Ruby语言的一个普遍认可的行为。

以下是ISO/IEC 30170:2012 * 信息技术-编程语言- Ruby* 规范中 * if表达式 * 的定义:

11.5.2.2.2 if表达式

语法

  • if-expression*::

      `if` * 表达式**then-clause**elsif-clause*else-clause*?`end`
  • then-clause*::

     * 分隔符**复合语句 *

    | then * 复合语句 * thencompound-statement

  • else-clause*::

      `else` * 复合语句 *
  • elsif-clause*::

      `elsif` * 表达式**then-clause*

语义

  • if-expression* 的计算方法如下:

1.对 expression 求值。让V为结果值。
1.如果V是一个较真实的对象,则计算 * then子句 * 的 compound-statementif-expression 的值是结果值。在这种情况下,elsif-clauses和 else-clause(如果有的话)不会被求值。
1.如果V是一个伪对象,并且没有 elsif-clauseelse-clause,那么 if-expression 的值是nil
1.如果V是一个伪对象,并且如果没有 elsif-clause 但是有一个 else-clause,那么计算 else-clausecompound-statementif-expression 的值是结果值。
1.如果V是一个伪对象,并且如果有一个或多个 elsif-clauses,则按如下方式计算 elsif-clauses的序列:
1.按照每个 elsif-clauseexpression 在程序文本中出现的顺序对其求值,直到有一个 elsif-clauseexpression 求值为true对象。让T成为这个 elsif-clause
1.如果T存在,则计算其 then-clausecompound-statementif-expression 的值是结果值。其他 elsif-clauses和T后面的 else-clause(如果有的话)不会被计算。
1.如果T不存在,并且如果存在 else-clause,则计算 else-clausecompound-statementif-expression 的值是结果值。
1.如果T不存在,并且没有 else-clause,则 if-expression 的值为nil
这里是language/if_spec.rb中ruby/spec定义的链接

koaltpgm

koaltpgm3#

像“string”或“boolean”这样的类描述了数据的类型。ifelse等。不是数据类型,但通常被称为“关键字”。

相关问题