[译] Ruby 2.6 String的split 方法支持代码块执行
本博客系列翻译自 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 方法支持代码块执行相关推荐
- Java String的split方法总结
String的split()方法用于按传入的字符或字符串对String进行拆分,返回拆分之后的数组. 1.一般用法 用一般的字符,例如@或,等符号做分隔符时: String address=" ...
- JAVA中String的split方法
我的个人网站: http://riun.xyz 以下源码版本:JDK1.8 简介 Java 中 String 的 split 方法可以将字符串根据指定的间隔进行切割,例如字符串 str = " ...
- String 中 split 方法的效率问题
问:String 中 split 方法使用时有什么效率问题吗? 答:String 的 split 分割字符串函数我们一般会如下方式使用. String[] arr = "a,b,c" ...
- String的split方法注意,空字符串问题
String的split方法返回的是一个String数组 意为 按照 "关键字" 分割 String字符串 注意的是: 分割之后的数组,会自动省略后面的空字符串,而不会省略前面的空 ...
- 类变量类方法,main方法,代码块,单例设计模式,final,抽象类
一.类变量和类方法 1.类变量 也叫静态变量/静态属性,是该类的所有对象共享的变量,任何一个该类的对象去访问它时,取到的都是相同的值,同样任何一个该类的对象去修改它时,修改的也是同一个变量. 1).定 ...
- 【Java基础】第6章_面向对象(下)-1:static关键字、main方法、代码块、final关键字
文章目录 1.关键字:static 1.1.static的使用 1.2.类变量 vs 实例变量内存解析 1.3.自定义 ArrayUtil工具类的优化 1.4.static 的应用举例 1.5.练习 ...
- Java. Static 修饰类_static 表示静态,它可以修饰属性,方法和代码块。
(1)static 表示静态,它可以修饰属性,方法和代码块. 1.static修饰属性(类变量),那么这个属性就可以用类名.属性名来访问,也就是使这个属性成为本类的类变量,为本类对象所共有.这个属性就 ...
- String类split方法
split方法是一个最常用的拆分字符串的方法.如果没有深入了解的话,就会采坑. 笔者前几天在项目中就遇到了这个坑,一直以为带一个分隔符的字符串,无论左右两侧是否有字符,都会解析为一个包含2个元素的数组 ...
- java str.split(quot;cquot;),你真的完全理解了String的split方法?之二
java中在处理String字符串时,很多场合都要使用split方法 本文就全面剖析 split(String regex, int limit)的用法 先来看看API: / ** * @param ...
最新文章
- oracle 优化之批量处理bulk correct 和 forall
- 通过Erlang构建TCP服务器
- 工业界推荐系统实用分析技巧
- Java HashMap 遍历方式性能探讨
- linux vma,内存管理 – Linux内核API find_vma
- python2安装_如何安装python2
- qgis折点打断_arcgis在折点处打断并建立网络分析(最短路径等问题)
- Eclipse run configrations 配置
- 听说你还不会写观察者模式?
- 当identity_insert 设置为off时不能为表_最近新get日志测试方法,再也不用为故障响应慢发愁!...
- MySQL转账储存过程_实用的银行转账存储过程和流水号生成存储过程
- 小米wifi linux 客户端下载,小米无线wifi安装_小米无线wifi客户端下载[最新版]-下载之家...
- java的数据类型有哪些_java数据类型有哪些
- 获取文件图片后缀名和图片转base64
- 美团大众点评2017校园招聘笔试(编程题)
- Xposed快速入门例子(二)----- 调方法的合适时机
- 头条文章没有阅读量,视频推荐量怎样增加
- 时钟(CLOCK)置换算法
- Android如何设置背景图片
- 21李刚python第四章
热门文章
- React 第六章 事件的绑定
- ReactJs 第二章 JSX
- Timer类 和 TimerTask类。一种有用计时器工具。可以每隔相同时间去执行某任务一次。
- ajax post 与get方法 data写法
- openvswitch patch port使用方法
- Spring核心知识点总结
- Spring Cloud核心组件原理分析
- centos7 搭建keepalived+Nginx+tomcat
- Bootstrap学习笔记--常用标签和类模板
- GridView”的控件 必须放在具有 runat=server 的窗体标记内 “错误提示”