Ruby 2.3 新特征

Ruby 2.3 新特征 首页 / Ruby入门教程 / Ruby 2.3 新特征

Ruby 2.3.0将于今年圣诞节发布, 几周前发布了第一个预览版。 让无涯教程查看引入了哪些新函数。

# Install using RVM
rvm install 2.3.0

# Using Rbenv
brew upgrade ruby-build --HEAD
rbenv install 2.3.0

Safe navigation operator

引入了新的运算符(&.)。在您需要在调用对象上的方法之前检查对象是否为nil的情况下,它可能非常有用。如果对象等于nil,它将返回nil,否则将调用该对象的方法。

# Ruby <= 2.2.x
if user && user.admin?
  # do something
end

# Ruby 2.3
if user&.admin?
  # do something
end

有一些注意事项需要考虑。 如果用户设置为false,则第一个版本的评估结果为false, 但是安全的导航操作员会抛出NoMethodError。 这类似于Rails的 #try! 方法。

Frozen string literals

在Ruby 2.2之前,字符串在Ruby中默认是可变的。 可以做类似str [2] ='z'之类的事情。 如果想使字符串不可变, 需要在其上调用#freeze (例如, str ='foobar'.freeze )。

使用冻结的(不可变的)字符串可以提高性能 因为Ruby现在必须分配更少的对象。 因此,有计划 在Ruby 3.0中默认使字符串不可变

为了使过渡更容易, Ruby 2.3允许您选择默认情况下冻结所有字符串文字。 您可以通过添加评论来启用此函数 frozen_string_literal:true 在文件的开头。 启用后,文件中的所有字符串文字将被冻结 即使不对它们调用#freeze 。 请注意,这仅在具有注释的文件上启用该函数。

# frozen_string_literal: true

str = 'cat'
str[0] = 'b'

# frozen.rb:5:in `[]=': can't modify frozen String (RuntimeError)
#   from frozen.rb:5:in `<main>'

尽管目前看来这似乎不是重大变化, 这将为顺利过渡到Ruby 3.0铺平道路。

Array#dig and Hash#dig

这是标准库的另一个有用的补充。 现在,可以访问数组和哈希中的嵌套元素 使用更简单的API。现在可以使用数组来做到这一点:

list = [
  [2, 3],
  [5, 7, 9],
  [ [11, 13], [17, 19] ]
]

list.dig(1, 2)    #=> 9
list.dig(2, 1, 0) #=> 17
list.dig(0, 3)    #=> nil
list.dig(4, 0)    #=> nil

Hashes:

dict = {
  a: { x: 23, y: 29 },
  b: { x: 31, z: 37 }
}

dict.dig(:a, :x) #=> 23
dict.dig(:b, :z) #=> 37
dict.dig(:b, :y) #=> nil
dict.dig(:c, :x) #=> nil

这在处理JSON数据时可能非常有用已经解析为哈希。

“Did you mean?”

当您由于方法名称中的错字而收到NoMethodError时, Ruby现在可以帮助建议与该名称相似的其他方法名称。

2.3.0-preview1 :001 > "foo bar".uppcase
NoMethodError: undefined method `uppcase' for "foo bar":String
Did you mean?  upcase
               upcase!

这可能看起来像个小小的变化, 但这是在2.3版本中最喜欢的函数。 使错误消息更有用具有巨大的影响 使该语言更易于使用, 特别是对于初学者。

Hash “comparison”

散列现在已在其上定义了比较方法。如果看到a >= b,则它正在检查b中的所有键值对是否也存在于a中。

{ x: 1, y: 2 } >= { x: 1 } #=> true
{ x: 1, y: 2 } >= { x: 2 } #=> false
{ x: 1 } >= { x: 1, y: 2 } #=> false

在上面的第一个示例中, RHS中的键值对 [:x,1] 是 在LHS中的代码- [[:x,1],[:y,2]] , 因此它返回true。

这也适用于所有其他比较运算符。 在Ruby中提出此函数的Olivier Lacan, 写了一个很好的解释 Ruby 2.3中的哈希比较

Hash#to_proc

Hash#to_proc 返回一个lambda,该lambda将键与值映射。 当您用钥匙呼叫lambda时, 它从哈希返回相应的值。

h = { foo: 1, bar: 2, baz: 3}
p = h.to_proc

p.call(:foo)  #=> 1
p.call(:bar)  #=> 2
p.call(:quux) #=> nil

它本身似乎没有用。为什么不使用 [] 访问元素?但是,当无涯教程使用&运算符创建proc并将其传递给 Enumerable块时,它变得很有趣。

h = { foo: 1, bar: 2, baz: 3}

# instead of this:
[:foo, :bar].map { |key| h[key] } #=> [1, 2]

# we can use this syntax:
[:foo, :bar].map(&h) #=> [1, 2]

Hash#fetch_values

此方法的工作方式类似于 Hash#values_at - 它获取与传入的键列表相对应的值。 区别在于,当键不存在时,#values_at 返回nil, 而#fetch_values 会为未显示的键引发 KeyError

h = { foo: 1, bar: 2, baz: 3}
h.fetch_values(:foo, :bar) #=> [1, 2]

h.values_at(:foo, :quux)    #=> [1, nil]
h.fetch_values(:foo, :quux) #=> raise KeyError

Enumerable#grep_v

grep_v 方法等效于 命令行grep实用程序中的-v 选项。 它返回不符合条件的项目列表。

list = %w(foo bar baz)

list.grep_v(/ba/)
#=> ['foo']

list.grep(/ba/)
#=> ['bar', 'baz']

Links

祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)

技术教程推荐

RPC实战与核心原理 -〔何小锋〕

动态规划面试宝典 -〔卢誉声〕

A/B测试从0到1 -〔张博伟〕

Spark性能调优实战 -〔吴磊〕

HarmonyOS快速入门与实战 -〔QCon+案例研习社〕

徐昊 · TDD项目实战70讲 -〔徐昊〕

B端产品经理入门课 -〔董小圣〕

结构思考力 · 透过结构看思考 -〔李忠秋〕

程序员职业规划手册 -〔雪梅〕

好记忆不如烂笔头。留下您的足迹吧 :)