为什么" uniq / uniq!"方法不适用于以下数组

时间:2015-04-30 09:11:38

标签: ruby

var_arry包含该类的所有实例变量。但我希望数组没有重复。我怎么能请帮助我。

file = open("sample.txt")    
var_arr = []

file.each do |line|
 var = line.match /@(\w+_\w+|\w+)/
  if var != nil
   var_arr << var
  end
end
puts var_arr.uniq!

我得到以下输出。但是我希望消除这个重复的值我使用.uniq!方法,但它无法工作

@event
@event
@event
@event
@event_participants
@event_participants
@event_participants
@event_participants
@event_participants
@event_participants
@event_participants
@event_participants
@project
@event
@project
@events
@projects
@events
@subscription
@admin
@subscription
@owners
@projects
@projects
@projects
@project_files
@project_file
@project_file
@project_file
@project_file
@sort_option
@sort_direction
@sort_filter
@sort_filter
@sort_filter
@sort_filter
@sort_filter
@sort_filter
@sort_filter
@sort_option
@sort_option
@sort_option
@sort_option
@sort_option
@sort_direction
@sort_direction
@sort_direction
@sort_direction
@sort_direction
@sort_filter
@projects
@projects
@sort_direction
@projects
@projects
@sort_option
@sort_filter
@projects
@projects
@message_template
@message_template
@message_template
@message_template
@message_template
@message_template
@message_template
@drag_evnt
@drag_evnt  

1 个答案:

答案 0 :(得分:3)

您将MatchData的实例放在数组中,由此行生成:

var = line.match /@(\w+_\w+|\w+)/

不要被puts输出混淆,它会在打印实体内部调用to_s,因此您可以获得实际MatchData实例的字符串表示。

为了提高效率,

Array#uniq!会比较hasheql?的值。要输入字符串,请使用:

var[1] if var[1]

或者,甚至更好:

lines = file.map do |line|
  $1 if line =~ /@(\w+_\w+|\w+)/
end.compact.uniq

后者将线条映射到匹配值或nil。 compact将摆脱nils,uniq将完成您的预期。