本篇内容介绍了“Ruby 2.7有什么新特征”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
自Ruby 2.1.0起, Ruby核心团队每年圣诞节都发布了新版本的Ruby, 这次我们得到了2.7.0。 这可能是Ruby的最新2.x版本, 因为Ruby 3.0有望在明年圣诞节发布。
这是一个简短的摘要 此发行版中一些最有趣的函数。 (有关以前的版本,请参阅: 2.6 , 2.5 , 2.4 , 2.3 )。
引入了新的模式匹配语法, 它允许您编写如下的case语句:
def test_pattern(value) case value in 0 'Zero' in Integer if value < 0 'Negative' in Integer => n "Number #{n}" in { value: x } "Hash value: #{x}" in _ 'Unknown' end end test_pattern(-1) #=> 'Negative' test_pattern(0) #=> 'Zero' test_pattern(2) #=> 'Number: 2' test_pattern({ value: 3 }) #=> 'Hash value: 3' test_pattern('four') #=> 'Unknown'
在2.6中,我们获得了无限范围, 这次我们将有无起点的范围。 这将允许使用如下语法:
case n when ..0 then 'Negative' when 1..9 then 'Single digit' when 10.. then 'Two or more' end
另一个有趣的用途 将是在DSL中使用此函数的能力。 例如, 我们可以在ActiveRecord中做到这一点:
Task.where(due_on: ..Date.today)
添加了新语法 将编号的参数添加到块中。
(1..3).map { _1 * _1 } #=> [1, 4, 9] hash = { a: 2, b: 3 } hash.map { "#{_1} = #{_2}" } #=> ["a = 1", "b = 2"] add_3 = -> { _1 + _2 + _3 } add_3.call(3, 5, 7) #=> 15
这些是人为的例子, 但到目前为止,我还不认为值得添加这种新语法, 而且我看不出自己在明确的论点上使用了它。
Enumerable#tally
计算一个枚举中每个项目的出现, 并将其作为哈希值返回。
strings = ['a', 'a', 'a', 'b', 'c'] strings.tally #=> { 'a' => 3, 'b' => 1, 'c' => 1 } # in 2.6, we'd do it like this: strings.each_with_object({}) do |value, result| result[value] ||= 0 result[value] += 1 end
Enumerable#filter_map
结合了select
和map
合并为一个块, 避免了中间数组分配的需要。
# squares of odd numbers in 1..10 (1..10).filter_map { |x| x*x if x.odd? } #=> [1, 9, 25, 49, 81] # ruby 2.6 (1..10).select(&:odd?).map { |x| x*x }
Array#intersection
与在数组上调用&等效,但是允许多个参数。
[1,2,3,4,5].intersection([2,3,4], [2,4,5]) #=> [2, 4]
Enumerator::Lazy#eager
会将惰性枚举数转换为非惰性枚举数。
(1..).lazy .select(&:odd?) # lazy .take(3) # lazy .eager # next operation will be non-lazy .map { |x| x * x } #=> [1, 9, 25]
添加了新语法( ...
)以允许 转发方法的所有参数。
def add(a, b) a + b end def add_and_double(...) add(...) * 2 end add_and_double(2, 3) #=> 10
在先前的Ruby版本中, 如果您有一个带有关键字参数的方法, 并以哈希作为最后一个参数来调用它, 哈希将被转换为关键字args。 但是,此方法已被弃用 以期在3.0中删除此行为。 现在,这将引起警告。
def foo(key: 1) key end foo({ key: 2 }) #=> 43 # warning: The last argument is used as the keyword parameter # warning: for `foo' defined here
splat运算符可用于将哈希转换为关键字args。
foo(**{ key: 2 })
private
的行为已略有变化。 以前,如果您在self
上调用了私有方法, (例如 self.foo
), 将提示 NoMethodError
错误。 现在通过self
调用私有方法不再引发错误。
除了添加的所有新函数之外, 这个版本也很有趣 对于某些没有切入的函数。
引入了管道运算符(pipeline), 如下示例
# with pipeline foo |> bar 1, 2 |> display # normal method chaining foo .bar(1, 2) .display
引入了方法参考运算符(method reference) 然后删除。 这本来可以写作 File.method(:read)
作为 File.:read
。
some_uri .then(&Net::HTTP.:get) .then(&JSON.:parse)
之所以被恢复,是因为 Matz和核心团队 想重新考虑更广泛的设计 关于函数式编程的函数 可以在Ruby中使用。
“Ruby 2.7有什么新特征”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。