gpt4 book ai didi

ruby - 字符串上的 Splat(星号)运算符

转载 作者:数据小太阳 更新时间:2023-10-29 07:45:23 28 4
gpt4 key购买 nike

要编写 splat 运算符的自定义结果,必须实现 to_a 方法。 String 类的示例:

class String
def to_a
self.split //
end
end

irb> res = *'text'
=> ["t", "e", "x", "t"]

但是如果没有上面的 monkeypatch,String 类对 to_a 方法一无所知:

irb> String.respond_to? :to_a
=> false

所以问题是,在标准“未打补丁”的字符串对象上应用 splat 运算符时会调用什么方法?

irb> res = *'text'
=> ['text']

最佳答案

首先:调用 String.respond_to?(:to_a) 不会告诉您字符串实例是否响应to_a ,它会告诉你 String class 是否响应 to_a。如果你想知道一个字符串是否响应to_a,你必须问这个字符串:

'text'.respond_to?(:to_a) # => false

或者你可以询问String类是否有公共(public)实例方法to_a:

String.public_instance_methods.include?(:to_a) # => false

现在,String 不响应 to_a原因是因为不清楚你想要什么:你想要一个字符数组?字形?行吗?代码点?字节数?

a = *'text'.chars      # => ['a', 'b', 'c']
a = *'text'.codepoints # => [116, 101, 120, 116]
a = *'text'.bytes # => [116, 101, 120, 116]
a = *'text'.lines # => ['text']

至于为什么 splat 运算符会以您所看到的方式运行,这似乎是语言规范中的一个极端情况。我什至不能 100% 确定这是有意为之的行为。多重赋值规范将近 4 页,详见 Ruby 语言规范第 11.4.2.4 节。

关于ruby - 字符串上的 Splat(星号)运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14342141/

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