本博客系列翻译自 Bigbinary 的 Ruby 2.6 系列, 已得到作者允许。Ruby 2.6.0-preview2 现已发布。

在Ruby 2.6之前, String#split 方法会返回一个被分割过的字符串数组。

在Ruby 2.6,我们可以传递代码块来枚举 String#split 的返回结果并进行操作。这样做就不用创建一个新的数组,因此内存会用得更具有效率。

接下来我们将增加一个方法 is_fruit? 来了解新的split 用法。

def is_fruit?(value)%w(apple mango banana watermelon grapes guava lychee).include?(value)
end
复制代码

输入是一组逗号连起来的蔬菜或者水果的名字,目标把它们用逗号切割并且把里头的水果保存起来。

过去的 String#split 用法

input_str = "apple, mango, potato, banana, cabbage, watermelon, grapes"splitted_values = input_str.split(", ")
=> ["apple", "mango", "potato", "banana", "cabbage", "watermelon", "grapes"]fruits = splitted_values.select { |value| is_fruit?(value) }
=> ["apple", "mango", "banana", "watermelon", "grapes"]
复制代码

Using split an intermediate array is created which contains both fruits and vegetables names.

Ruby 2.6 的可以带上代码块的 String#split 用法

fruits = []input_str = "apple, mango, potato, banana, cabbage, watermelon, grapes"input_str.split(", ") { |value| fruits << value if is_fruit?(value) }
=> "apple, mango, potato, banana, cabbage, watermelon, grapes"fruits
=> ["apple", "mango", "banana", "watermelon", "grapes"]
复制代码

当我们把代码块传递给split 方法,它会返回被分割的字符串并且不会创建一个数组。String#split 的代码块会出每一个被分割的字符串 ,这个例子里头我们往fruits 数组中推送水果名称。

后续更新

性能比较

我们创建了一个巨大无比的随机字符串来评估split 和 split + 代码块的性能差异。

require 'securerandom'test_string = ''100_000.times.each dotest_string += SecureRandom.alphanumeric(10)test_string += ' '
end
复制代码
require 'benchmark'Benchmark.bmbm do |bench|bench.report('split') doarr = test_string.split(' ')str_starts_with_a = arr.select { |str| str.start_with?('a') }endbench.report('split with block') dostr_starts_with_a = []test_string.split(' ') { |str| str_starts_with_a << str if str.start_with?('a') }endend
复制代码

结果

Rehearsal ----------------------------------------------------
split              0.023764   0.000911   0.024675 (  0.024686)
split with block   0.012892   0.000553   0.013445 (  0.013486)
------------------------------------------- total: 0.038120secuser     system      total        real
split              0.024107   0.000487   0.024594 (  0.024622)
split with block   0.010613   0.000334   0.010947 (  0.010991)
复制代码

我们也用了benchmark/ips 来做了另一种性能测量。

require 'benchmark/ips'
Benchmark.ips do |bench|bench.report('split') dosplitted_arr = test_string.split(' ')str_starts_with_a = splitted_arr.select { |str| str.start_with?('a') }endbench.report('split with block') dostr_starts_with_a = []test_string.split(' ') { |str| str_starts_with_a << str if str.start_with?('a') }endbench.compare!
end
复制代码

结果是

Warming up --------------------------------------split     4.000  i/100mssplit with block    10.000  i/100ms
Calculating -------------------------------------split     46.906  (± 2.1%) i/s -    236.000  in   5.033343ssplit with block    107.301  (± 1.9%) i/s -    540.000  in   5.033614sComparison:split with block:      107.3 i/ssplit:       46.9 i/s - 2.29x  slower
复制代码

结果看来,split 带上block 的新用法在性能上是两倍于过去的老玩法的。

这里是相关的commit 和 讨论。

原文地址

博客地址

[译] Ruby 2.6 String的split 方法支持代码块执行相关推荐

  1. Java String的split方法总结

    String的split()方法用于按传入的字符或字符串对String进行拆分,返回拆分之后的数组. 1.一般用法 用一般的字符,例如@或,等符号做分隔符时: String address=" ...

  2. JAVA中String的split方法

    我的个人网站: http://riun.xyz 以下源码版本:JDK1.8 简介 Java 中 String 的 split 方法可以将字符串根据指定的间隔进行切割,例如字符串 str = " ...

  3. String 中 split 方法的效率问题

    问:String 中 split 方法使用时有什么效率问题吗? 答:String 的 split 分割字符串函数我们一般会如下方式使用. String[] arr = "a,b,c" ...

  4. String的split方法注意,空字符串问题

    String的split方法返回的是一个String数组 意为 按照 "关键字" 分割 String字符串 注意的是: 分割之后的数组,会自动省略后面的空字符串,而不会省略前面的空 ...

  5. 类变量类方法,main方法,代码块,单例设计模式,final,抽象类

    一.类变量和类方法 1.类变量 也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量. 1).定 ...

  6. 【Java基础】第6章_面向对象(下)-1:static关键字、main方法、代码块、final关键字

    文章目录 1.关键字:static 1.1.static的使用 1.2.类变量 vs 实例变量内存解析 1.3.自定义 ArrayUtil工具类的优化 1.4.static 的应用举例 1.5.练习 ...

  7. Java. Static 修饰类_static 表示静态,它可以修饰属性,方法和代码块。

    (1)static 表示静态,它可以修饰属性,方法和代码块. 1.static修饰属性(类变量),那么这个属性就可以用类名.属性名来访问,也就是使这个属性成为本类的类变量,为本类对象所共有.这个属性就 ...

  8. String类split方法

    split方法是一个最常用的拆分字符串的方法.如果没有深入了解的话,就会采坑. 笔者前几天在项目中就遇到了这个坑,一直以为带一个分隔符的字符串,无论左右两侧是否有字符,都会解析为一个包含2个元素的数组 ...

  9. java str.split(quot;cquot;),你真的完全理解了String的split方法?之二

    java中在处理String字符串时,很多场合都要使用split方法 本文就全面剖析 split(String regex, int limit)的用法 先来看看API: / ** * @param ...

最新文章

  1. oracle 优化之批量处理bulk correct 和 forall
  2. 通过Erlang构建TCP服务器
  3. 工业界推荐系统实用分析技巧
  4. Java HashMap 遍历方式性能探讨
  5. linux vma,内存管理 – Linux内核API find_vma
  6. python2安装_如何安装python2
  7. qgis折点打断_arcgis在折点处打断并建立网络分析(最短路径等问题)
  8. Eclipse run configrations 配置
  9. 听说你还不会写观察者模式?
  10. 当identity_insert 设置为off时不能为表_最近新get日志测试方法,再也不用为故障响应慢发愁!...
  11. MySQL转账储存过程_实用的银行转账存储过程和流水号生成存储过程
  12. 小米wifi linux 客户端下载,小米无线wifi安装_小米无线wifi客户端下载[最新版]-下载之家...
  13. java的数据类型有哪些_java数据类型有哪些
  14. 获取文件图片后缀名和图片转base64
  15. 美团大众点评2017校园招聘笔试(编程题)
  16. Xposed快速入门例子(二)----- 调方法的合适时机
  17. 头条文章没有阅读量,视频推荐量怎样增加
  18. 时钟(CLOCK)置换算法
  19. Android如何设置背景图片
  20. 21李刚python第四章

热门文章

  1. React 第六章 事件的绑定
  2. ReactJs 第二章 JSX
  3. Timer类 和 TimerTask类。一种有用计时器工具。可以每隔相同时间去执行某任务一次。
  4. ajax post 与get方法 data写法
  5. openvswitch patch port使用方法
  6. Spring核心知识点总结
  7. Spring Cloud核心组件原理分析
  8. centos7 搭建keepalived+Nginx+tomcat
  9. Bootstrap学习笔记--常用标签和类模板
  10. GridView”的控件 必须放在具有 runat=server 的窗体标记内 “错误提示”