您好,登录后才能下订单哦!
本篇内容主要讲解“Ruby 2.3新特征有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Ruby 2.3新特征有哪些”吧!
让我们查看引入了哪些新函数。
# Install using RVMrvm install 2.3.0# Using Rbenvbrew upgrade ruby-build --HEADrbenv install 2.3.0
引入了新的运算符(&.)。在您需要在调用对象上的方法之前检查对象是否为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!
方法。
在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数据时可能非常有用 我们已经解析为哈希。
当您由于方法名称中的错字而收到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版本中最喜欢的函数。 使错误消息更有用具有巨大的影响 使该语言更易于使用, 特别是对于初学者。
散列现在已在其上定义了比较方法。如果看到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']
到此,相信大家对“Ruby 2.3新特征有哪些”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。