2014-02-14 3 views
0

Прошу прощения за странные формулировки. Я не знаю, как вы это называете. У меня есть этот массив:Получить элемент массива по его содержанию

[#<Item:0x007faeea066508 @name="Backpack", @exam="Not much here... just a backpack">] 

Это массив инвентаря. Пользователь наберет что-то вроде «осмотреть рюкзак», и он вернет @exam этого элемента. Как бы вы получили этот элемент, зная только @name? Благодаря!

+0

Если читатель озадачен этим массивом, он содержит один элемент: экземпляр класса 'Item'. –

ответ

1

Это то, что у вас есть:

class Item 
    # accessors for @name and @exam possibly defined here 
    def initialize(name, exam) 
    @name = name 
    @exam = exam 
    end 
    # methods possibly defined here 
end 

item = Item.new("Backpack", "Just a backpack") 
    #=> #<Item:0x0000010201dda0 @name="Backpack", @exam="Just a backpack"> 

Так у вас есть массив a с одним элементом, экземпляр класса Item с переменные экземпляра @name и @exam, имеющие значения «Рюкзак» и «Только рюкзак» соответственно:

a = [item] 
    #=> [#<Item:0x0000010201dda0 @name="Backpack", @exam="Just a backpack">] 

Вы можете использовать Object#instance_variable_get для получения значений переменных экземпляра @name и @exam, которые я буду хранить в локальных переменных name и exam:

name = a.first.instance_variable_get(:@name) #=> "Backpack" 
exam = a.first.instance_variable_get(:@exam) #=> "Just a backpack" 

Теперь, когда у вас есть значения этих переменных, вы можете сделать что бы вы ни хотели с ними.

1

Вы, вероятно, хотите, чтобы выбрать, используя блок (предполагая, что ваш класс Item отвечает .name и .exam:

items = [#<Item:0x007faeea066508 @name="Backpack", @exam="Not much here... just a backpack">] 
item = items.select {|i| i.name =~ /backpack/i } 
puts item.exam 
0

Вот мой код:

articles = ArticleType.all 

Мой результат:

[#<ArticleType id: 1, name: "News", slug: "news">, #<ArticleType id: 2, name: "Articles", slug: "articles">] 

Чтобы получить значение имени первого элемента:

articles[0].name 
=> "News" 

Чтобы получить значения для имени, вашего массива:

ArticleType.all.map(&:name) 

Чтобы получить элементы, которые содержит 'N':

ArticleType.all.map { |x| puts x.name if x.name.include?('N') } 
=> News 

Я надеюсь, что это помогает!

0

Вы можете сделать это следующим образом: -

user_typed_string = "examine backpack" 

items = [#<Item:0x007faeea066508 @name="Backpack", @exam="Not much here... just a backpack">] 

item = items.select {|i| user_typed_string.include?(i.name) }.last 

exam = item.exam unless item.nil? 
Смежные вопросы