Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите разобраться: хеш, ключ - объект... не получается сделать ключ в хэше 
:(
    Опции темы
maep
Дата 27.6.2008, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



Господа, помогите начинающемуsmile

Ситуация такая: мне нужно сделать хэш,где ключевым полем будет объект типа "Пара", вот такой:

Код

class Pair
  @v1
  @v2
  
  def initialize (v1, v2)
    @v1 = v1
    @v2 = v2
  end
   
  def first
    @v1
  end
  
  def second
    @v2
  end
  
  def == (v)
    v.first == @v1 and v.second == @v2
  end

end



В цикле я добавляю в хэш объекты примерно так:
Код

@h = Hash.new
conn.exec('select ... from c_param_dump') do |r| 
par = Param.new(...)
mp = pair.new(r[0], r[1])
@h[mp] = par
end


теперь, я хочу найти в хэше объект типа Param, который соответствует паре ('mama', 'papa')
Как это сделать?
 тупо
Код

puts @h[Pair.new('mama','papa'].field_of_Param_class

не выходит, никакого значения не находится. Явно тут ошибка, и для того, чтоб осуществлялся такой поиск, недостаточно переопределить оператор сравнения для класса Pair:) А что нужно - не могу сообразить.

Заранее спасибо!

Добавлено через 10 минут и 51 секунду
.... добваил в Pair
Код

def eql?(v)
    v == self
  end

  def hash
  @v1+'fsdafdas'+@v2
  end
  


 - не помогло....
PM MAIL   Вверх
shine
Дата 27.6.2008, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 20.10.2006

Репутация: 3
Всего: 5



Код

mp = Pair.new(r[0], r[1])


Я в том смысле, что из-за этой ошибки у вас хэш остается пустым

Это сообщение отредактировал(а) shine - 27.6.2008, 09:43
--------------------
An investment in knowledge always pays the best interest. © Benjamin Franklin
PM MAIL   Вверх
maep
Дата 27.6.2008, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



shine,  вы в том плане что pair с маленькой буквы? К сожалению, дело не в этом: эта ошибка закралась в пост, а в коде все нормально: просто для  вопроса на форум я его слегка подсократил, в изначлальном коде пару создает другой объект (проверено что создает правильно).
Кстати, я ключ индекс по объекту Pair на Pair.hash - все работает. Но это ключ по строке, хотелось бы все же уметь по объекту...

Добавлено через 40 секунд
Блин, нечаянно вместо ответа сюда первый раз написал модераторуsmile Прошу прощения, просто не ту кнопку нажал....
PM MAIL   Вверх
shine
Дата 27.6.2008, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 137
Регистрация: 20.10.2006

Репутация: 3
Всего: 5



В класс нужно добавить метод hash такой что при истинном a.eql?(b) будет выполнятся равенство a.hash == b.hash
--------------------
An investment in knowledge always pays the best interest. © Benjamin Franklin
PM MAIL   Вверх
maep
Дата 28.6.2008, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 27.6.2008

Репутация: нет
Всего: нет



shine, 
есть такой.

вот целиком класс
Код

class Pair
  @v1
  @v2
  
  def initialize (v1, v2)
    @v1 = v1
    @v2 = v2
  end
   
  def first
    @v1
  end
  
  def second
    @v2
  end
  
  def == (v)
    v.first == @v1 and v.second == @v2
  end
  
  def eql?(v)
    v == self
  end

  def hash
  @v1+'fsdafdas'+@v2
  end
  
end



PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Ruby: Общие вопросы"
source777
  • С чего начать? начинаем
  • Ссылки на полезные ресурсы смотрим тут
  • Обязательно следуйте правилам Vingrad.
  • Пожалуйста, прочитайте рекомендации по работе в форуме и навигации по Vingrad.
  • Для вставки кодов Ruby используйте тег: [code=ruby]код[/code]. Когда в будущем подсветка синтаксиса для Ruby будет реализована, весь исходных код преобразится.
  • Используйтe чекбокс "Транслит" (возле кнопок кодов), если у Вас нет русских шрифтов.
  • Помните, для каждого вопроса должна быть своя тема.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, source777.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Ruby: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0904 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.