2014-10-13 5 views
0
@ dictionary = {"cat"=>"Sam"} 

Это возвращение ключRuby как вернуть элемент словаря?

@dictionary.key(x) 

Это возвращает значение

@dictionary[x] 

Как вернуть весь элемент "кот" => "Сэм"

+0

Мы называем это Hash в Ruby, не словарь , –

+0

'' cat "=>« Сэм »- это пара, т. Е. Два элемента« cat »и« Sam ». Он не может быть возвращен как отдельный объект. – Stefan

ответ

1
@dictionary 

должен сделать трюк для вас

Каково бы ни было последнее оцениваемое выражение в ruby, является возвращаемым значением метода. Если вы хотите вернуть хеш в целом. последняя строка метода должна выглядеть как строка, которую я написал выше

+0

@dictionary вернет весь словарь? Я просто хочу вернуть 1 элемент – user1854438

+0

, вы не понимаете его sir, '@dictionary = {" cat "=>" Sam "}' line означает, что существует переменная экземпляра, называемая '@ dictionary', которая является хешем и имеет значение '{ "кот"=> "Сэм"}' – aelor

0

Если вы хотите вернуть один элемент хэша h, вам нужно будет указать ключ для идентификации элемента. Поскольку значение для ключа k равно h[k], пара ключ-значение, выраженная в виде массива, равна [k, h[k]]. Если вы хотите сделать хэш с одним элементом, используйте Hash[[[k, h[k]]]].

Например, если

h = { "cat"=>"Sam", "dog"=>"Diva" } 

и вы хотели только к элементу с ключом "cat", который был бы

["cat", h["cat"]]   #=> ["cat", "Sam"] 

или

Hash[[["cat", h["cat"]]]] #=> {"cat"=>"Sam"} 

С Рубином 2.1 вы могли бы в качестве альтернативы получить хэш вот так:

[["cat", h["cat"]]].to_h #=> {"cat"=>"Sam"} 

Давайте посмотрим на более интересный случай. Предположим, у вас есть массив arr, содержащий некоторые или все ключи хеша h. Тогда вы можете получить все пары ключ-значение для этих ключей с помощью методов Enumerable#zip и Hash#values_at:

arr.zip(arr.values_at(*arr)) 

Предположим, например,

h = { "cat"=>"Sam", "dog"=>"Diva", "pig"=>"Petunia", "owl"=>"Einstein" } 

и

arr = ["dog", "owl"] 

Тогда:

arr.zip(h.values_at(*arr)) 
    #=> [["dog", "Diva"], ["owl", "Einstein"]] 

На этапах:

a = h.values_at(*arr) 
    #=> h.values_at(*["dog", "owl"]) 
    #=> h.values_at("dog", "owl") 
    #=> ["Diva", "Einstein"] 
arr.zip(a) 
    #=> [["dog", "Diva"], ["owl", "Einstein"]] 

Чтобы вместо выразить как хэш:

Hash[arr.zip(h.values_at(*arr))] 
    #=> {"dog"=>"Diva", "owl"=>"Einstein"} 
0

Ваш пример немного в заблуждение в том смысле, что имеет только одну пару (хотя и не обязательно) (?) , и вы хотите получить одну пару.То, что вы называете «словарем», на самом деле является хэшмапом (так называемый хэш среди рубистов).

A hashrocket (=>) является частью синтаксиса определения хэша. Его нельзя использовать вне его. То есть вы не можете получить только одну пару без создания нового хэша. Итак, новая такая пара будет выглядеть так: { key => value }.

Так что для этого вам понадобится ключ и значение в контексте вашего кода. И вы указали способы получить оба, если у вас есть. Если у вас есть только значение, то:

{ @dictionary.key(x) => x } 

... и если только ключ, а затем:

{ x => @dictionary[x] } 

... но нет никакой практической необходимости в этом. Если вы хотите обработать каждую пару в хэш, использовать итератор кормить каждую пару в некоторый код, как список аргументов:

@dictionary.each do |key, value| 
    # do stuff with key and value 
end 

Таким образом, блок кода получите каждую пару в хэш раз.

Если вы хотите получить не хэш, а пары элементов он построен из, вы можете преобразовать ваш хэш в массив:

@dictionary.to_a 
# => [["cat", "Sam"]] 
# Note the double braces! And see below. 
# Let's say we have this: 
@dictionary2 = { 1 => 2, 3 => 4} 
@dictionary2[1] 
# => 2 
@dictionary2.to_a 
# => [[1, 2], [3, 4]] 
# Now double braces make sense, huh? 

Он возвращает массив пар (которые являются массивами, а) всех элементов (ключей и значений), которые содержит ваш хэш.

0

Вы можете получить ключ и значение в один раз - в результате в массиве:

@h = {"cat"=>"Sam", "dog"=>"Phil"} 
key, value = p h.assoc("cat") # => ["cat", "Sam"] 

Использование rassoc для поиска по значению (.rassoc("Sam"))

Смежные вопросы