我有一个User
课程如下:
class User
attr_reader :username, :password
def inintialize(username, password)
@username = username
@password = password
end
end
我希望将这些User
类中的许多类存储在数组中,如下所示:
users = []
def initialize_users
user = User.new("user0", "password0")
users.push(user)
user = User.new("user1", "password1")
users.push(user)
end
现在我想实现一个搜索功能,我可以通过用户名或密码进行搜索。我知道我可以迭代比较每个字段的类,如下所示:
def search(username)
users.each do |user|
if user.username == username then
puts "Found"
break
end
end
end
但是没有任何其他方法可以在没有迭代的情况下执行此操作,或者这只是最简单/最干净的方法吗?
我在想也许有办法做一些事情:
users["username_to_find"]
=> true
虽然我不确定如何实现这一点。我相信我必须重写User
类才能有一个内置列表,但是从那里我迷失了。我想即使我实现了这个功能,仍然需要进行迭代。
此外,我想从该表示法中访问该用户数据,例如
users["username_to_find"].password
=> "password111"
有人有什么想法吗?
PS:User
类缩减为相关代码,它实际上包含更多特定于每个用户的数据成员(如套接字),方法用于将数据发送给特定用户插座。
答案 0 :(得分:0)
如果它不是一个数组,为什么不使用哈希?它提供了您想要的功能。
05-19 01:36:22.478: V/Provider/Settings(7367): from settings cache , name = sound_effects_enabled , value = 0
05-19 01:36:22.494: D/ActivityThread(7367): hoder:android.app.IActivityManager$ContentProviderHolder@42cce4c8,provider,holder.Provider:android.content.ContentProviderProxy@42cceea0
05-19 01:36:22.606: D/Provider/Settings(7367): put string name = ringtone , value = null userHandle = 0
05-19 01:36:22.631: I/RingtoneManager(7367): Set actual default ringtone uri= null
像这样访问它
users = {}
user = User.new("user0", "password0")
users[user.username] = user
答案 1 :(得分:0)
你真的别无选择,只能迭代数组的每个元素并执行匹配测试。 users['tim_the_toolman'] # => nil, there is no user by that name
users['user0'] # => returns user0
users['user0'].password # => 'password0'
是你想要使用的:
Enumberable#detect
这会返回带有匹配用户名的第一个def search(username)
# return the first matching result
users.detect { |user| user.username == username }
end
或User
。如果你想允许返回多个结果(例如,更多的单词" search"表示),那么你想要使用nil
返回所有匹配的块:
Enumberable#select
如果您需要在多个条件上进行匹配(例如搜索用户名和名字等),则需要采用此方法。如果您仅搜索用户名,则上述@dax提供的解决方案是完美的。
答案 2 :(得分:0)
使用数组find
和select
方法。假设您按名称搜索
find
返回满足条件的第一个对象 array.find { |user| user.name == searched_name } # will be either one User or nil, if neither has name eq to searched_name
select
返回满足您条件的所有对象 array.select { |user| user.name == searched_name } #will be either array of Users which have name eq searched_name or an empty array when none has this name