在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)的用途.

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...