微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Ruby中,有什么方法可以过滤包含“time”一词的对象的所有方法?

我尝试了以下内容,部分工作:

>> s.methods.map {|n| n if n =~ /time/}
=> [nil,nil,"skip_time_zone_conversion_for_attri
butes",ni
l,"timestamped_migrations",n
il,"time_zone_aware
_attributes","default_timezone","recor
d_timestamps",nil]

>> s.methods.each {|n| p n if n =~ /time/}
"skip_time_zone_conversion_for_attributes"
"timestamped_migrations"
"time_zone_aware_attributes"
"default_timezone"
"record_timestamps"
=> ["extended_by","before_create","Vote_ids=","save_without_dirty","_delete","touch","daemonize","after_destroy","skip_time_zone_conversion_for_attribut
es","methods","send","to_query","becomes","after_validation","store_full_s
ti_class?","save_with_transactions!","autosave_associated_records_for_Votes","require_library_or_gem","enum_for","taint","instance_variable_defined?","ac
     [...] and the rest of the whole array

>> s.methods.filter {|n| n =~ /time/}
NoMethodError: undefined method `filter' for #<Array:0x4de6b00>
        from (irb):93

解决方法

grep是实现此目的的另一种简单方法

1.9.0 > require 'date'
 => true 
1.9.0 > x = Date.new
 => #<Date: -1/2,2299161> 
1.9.0 > x.methods.grep /time/
 => ["ctime","asctime","strftime"]

使用您尝试的方法

map将给定块应用于给定枚举的每个元素,返回一个新的可枚举.这不是你想要的(正如你所看到的).

方法也是一种工作,但显然只是打印出结果并不是非常有用.它根本不像Ruby,但你可以做到:

matching_methods = []
s.methods.each {|m| matching_methods << m if m =~ /time/}

将匹配/时间/匹配的每个方法累积到matching_methods数组中.当然,如果你这样做,那么

s.methods.select { |m| m =~ /time/ }

是优选的.

最后,Ruby中不存在过滤器;这就是select(或find_all)的用途.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐