Ruby中end_with?判断成立时如何返回匹配的后缀字符串值
实现方案
Ruby 原生的 String#end_with? 只会返回 true/false 布尔值,要实现匹配成功时返回命中后缀、失败返回假值的效果,两种写法足够用:
无侵入直接写法
不用改原生方法,业务代码里随用随写,性能和原生调用一致:
# 多后缀匹配场景 file_name = "some_pdf" permitted_file_types = %w(image pdf) file_type = permitted_file_types.find { |ext| file_name.end_with?(ext) } puts file_type # >> "pdf"
# 单后缀匹配场景 s = "my_name" name = ["name"].find { |suffix| s.end_with?(suffix) } puts name # >> "name"
匹配失败时会返回nil,属于假值,原来写的条件判断逻辑完全不受影响。
复用扩展写法
如果这个逻辑用得频繁,用 Ruby 的 Refinements 安全扩展 String 类就行,别直接全局改原生方法,容易坑到第三方依赖:
module EndWithMatchedSuffix refine String do def end_with?(*suffixes) suffixes.find { |suf| super(suf) } end end end # 需要用的作用域里引入即可 using EndWithMatchedSuffix # 完全符合预期的调用方式 s = "my_name" name = s.end_with?("name") puts name # >> "name" file_name = "some_pdf" file_type = file_name.end_with?(*%w(image pdf)) puts file_type # >> "pdf" # 未匹配返回nil,和原方法返回false的条件判断表现完全一致 puts "test_file".end_with?("exe", "dll") # >> nil
内容的提问来源于stack exchange,提问作者Ryan Roberts
相关产品推荐
相关产品推荐

