Ruby 3.1 – 简写哈希语法 – 第一印象
又到了一年一度的季节,Ruby 3.1 的一系列新功能将在 12 月发布之前获得批准和合并。
本系列将涵盖我在 Bug 追踪器中发现的一些有趣的问题。你觉得有什么有趣的吗?请通过 Twitter @keystonelemur 发送给我,或者在这里评论。
简写哈希语法——第一印象
这就是我很久以来一直想要的东西。简写哈希语法(在 JavaScript 中也称为双关语)是一个非常有用的功能,它允许你省略变量名与键相同的值:
a = 1
b = 2
{ a:, b: }
# => { a: 1, b: 2 }
在 Javascript 中这将像这样:
const a = 1
const b = 2
{ a, b }
因此你可以看到两者之间的一些相似之处。
提交和跟踪器
您可以在此处找到相关差异,并在此处找到 bugtracker 问题。
探索测试用例
让我们看一下差异的规格(略有缩写):
def test_value_omission
x = 1
y = 2
assert_equal({x: 1, y: 2}, {x:, y:})
assert_equal({one: 1, two: 2}, {one:, two:})
end
private def one = 1
private def two = 2
现在,如前所述,这允许省略值,如第一个断言中所述:
x = 1
y = 2
assert_equal({x: 1, y: 2}, {x:, y:})
这就是我期望该功能能够实现的,并且已经开辟了很多潜力,我稍后会讲到,但第二个功能还有其他用途:
assert_equal({one: 1, two: 2}, {one:, two:})
# ...
private def one = 1
private def two = 2
……它也致力于方法论的研究,这开辟了一个充满有趣潜力的全新领域。我将把这些内容分为两部分,分别阐述我认为各自的含义。
双关语的含义
让我们从一般含义开始,因为我相信仅凭这些就足够有趣了。
模式匹配
和我一起考虑模式匹配:
case { x: 1, y: 2 }
# I do still wish `y` was captured here without right-hand assignment
in x:, y: ..10 => y then { x:, y: y + 1 }
# ...
end
这样,我们就不用再保留一个值不变,而直接显式地处理另一个值了。在 JSON 响应的另一个例子中,我们可能希望在更改一个字段的同时提取其他字段:
case response
in code: 200, body: { messages:, people: }
{ messages:, people: people.map { Person.new(_1) } }
in code: 400.., body: { error:, stacktrace: }
{ error:, stacktrace: stacktrace.first(5) }
# ...
end
它使我们能够更简洁地提取和转换内容。
注意:我还没有尝试过将其与常规
Hash
语法结合,但根据代码,我假设这应该可行parse.y
。还需要更多实验。
关键字参数
一般来说,关键字参数对于 Ruby 的可理解性和错误有巨大的增值作用:
# (A tinge contrived, yes)
def json_logger(level:, message:, limit: nil)
new_message = limit ? message.first(limit) : message
Logger.log({ level: level, message: new_message }.to_json)
end
有一个参数还不错,但关键字参数最大的烦恼就是不断地这样做:
some_method(a: a, b: b, c: c, d: d + 4)
这感觉重复,而且没有额外的价值。JS 中的双关语将这些信息省略为参数,这些参数应该无需转换即可转发,Ruby 简写哈希语法也是如此。关键字参数的好处在于无需编写任何额外代码:
some_method(a:, b:, c:, d: d + 4)
现在我们可以快速看到d
正在被修改的内容,从而让我们更清楚地看到代码的意图,同时还可以获得围绕名称检查、值检查和更容易理解的方法的关键字参数的所有好处。
我认为这是最高的附加值。
包含方法的含义
这个有点不寻常,但我喜欢这个想法。
配置哈希
很多情况下我需要组装更大的配置哈希值。通过将部分配置放入方法中,我使其更易于管理:
def configuration
{ a:, b:, c: }
end
private def a = {}
private def b = {}
private def c = {}
这些可能是诸如记录器配置、AWS 密钥、库配置之类的东西,还有非常有趣的(我不知道这是否会起作用)可选配置级联:
def configuration
{
**({ logger:, stack_limit:, tracing: } if logging.enabled?),
**({ shards:, rw:, clusters: } if db.sharded?),
# ...
}
end
当然,这些都是理论上的,我需要在夜间构建完成后花费大量时间来使用此功能以确保这一点,但如果它确实有效,它将为未来一些非常有趣的级联配置样式打开大门。
包起来
这篇文章是关于简写哈希语法的初步印象,我希望有时间好好体验一下,能想出一些新点子。在此之前,我会关注 bug 追踪器,看看即将推出哪些有趣的新功能。
鏂囩珷鏉ユ簮锛�https://dev.to/baweaver/ruby-3-1-shorthand-hash-syntax-first-impressions-19op