gpt4 book ai didi

ruby - => 和 : in Ruby? 是什么

转载 作者:行者123 更新时间:2023-12-05 02:49:46 24 4
gpt4 key购买 nike

当我们在 Ruby 中定义一个 Hash 时,我们可以使用几种语法:

# IRB Ruby 2.7.1 - Defining a Hash
my_hash = { 'string_transformed_into_symbol_1': 'value',
"string_transformed_into_symbol_2": 'value',
'string_1' => 'value',
"string_2" => 'value',
symbol_1: 'value',
:symbol_2 => 'value' }

我在想箭头 => 来自 Ruby 1.8,被冒号 : 取代。不过,从上面的例子中,我们可以看出它不仅仅是一个语法糖:: 将一个键 String 转换为 Symbol:

# IRB Ruby 2.7.1 - Outputing a Hash
my_hash
=> { :string_transformed_into_symbol_1 => "value",
:string_transformed_into_symbol_2 => "value",
"string_1" => "value",
"string_2" => "value",
:symbol_1 => "value",
:symbol_2 => "value" }

来自 this question , mu is too short's great answer stated:

The JavaScript style (key: value) is only useful if all of your Hash keys are "simple" symbols (more or less something that matches /\A[a-z_]\w*\z/i[...]But you still need the hashrocket if your keys are not symbols.

这让我将 :=> 视为方法(但我知道我错了)。但是,我在文档中找不到任何关于它的信息。

::=> 究竟是什么?我如何才能更多地了解它们,以及它们在 Ruby 源代码中的何处定义?

最佳答案

词法分析器/解析器标记

您引用的符号不是方法或运算符,它们是用于解释源代码语法的词法分析器/解析器标记。 hashrocket 被定义为 tASSOC association token ,用于关联诸如键/值对或exception stack traces之类的东西.

冒号在 Ruby 中有多种用途,但 IIRC Ruby 2.x 引入了后缀冒号作为 tASSOC 的语法糖,当左侧是符号时。我不太确定在复杂情况下如何定义或解析 token — assoc是这个例子最有可能的赌注——但出于实际目的,您可以简单地将 a: 1 视为在语义上等同于 :a => 1

您还可以使用 Ripper#sexp检查您的源代码以查看解释器将如何解析这些行。例如:

require 'ripper'

pp Ripper.sexp "{a: 1}"
[:program,
[[:hash,
[:assoclist_from_args,
[[:assoc_new, [:@label, "a:", [1, 1]], [:@int, "1", [1, 4]]]]]]]]
#=> [:program, [[:hash, [:assoclist_from_args, [[:assoc_new, [:@label, "a:", [1, 1]], [:@int, "1", [1, 4]]]]]]]]

pp Ripper.sexp "{:a => 1}"
[:program,
[[:hash,
[:assoclist_from_args,
[[:assoc_new,
[:symbol_literal, [:symbol, [:@ident, "a", [1, 2]]]],
[:@int, "1", [1, 7]]]]]]]]
#=> [:program, [[:hash, [:assoclist_from_args, [[:assoc_new, [:symbol_literal, [:symbol, [:@ident, "a", [1, 2]]]], [:@int, "1", [1, 7]]]]]]]]

在这两种情况下,您都可以看到 S 表达式使用冒号构建“assoc_new”子表达式。要进一步深入,您必须引用 Ruby 源代码树。

另见

关于ruby - => 和 : in Ruby? 是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63935662/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com