2015-05-23 2 views
0
class Person 
    def sampleMethod 
    end 
end 

jack = Person.new 
input = gets.chomp 

Как я могу вызвать объект-объект через пользовательский ввод? Я пробовал:Динамические вызовы объектов

input = gets.downcase.chomp.to_sym 

Он называет методы, но объекты.

Я также попытался это:

eval input + '.sampleMethod' 

и это:

Kernel.const_get(input).sampleMethod 

Пожалуйста, помогите.

+0

Какое содержимое вводит? – pangpang

+0

Зачем вам выбирать ответ только через 20 минут, когда был предложен только один ответ? В следующий раз, я предлагаю вам немного подождать (несколько часов, скажем). Там нет спешки. Быстрый выбор может препятствовать другим, возможно лучшим ответам, и не учитывает тех, кто все еще работает над своими ответами. Обратите внимание, что если вы выберете ответ, а затем вам будет предоставлен другой вариант, вы всегда можете изменить свой выбор. –

ответ

1

Я хотел бы хранить каждого человека в хеше, где ключи хэша - это имена, на которые можно ссылаться.

class Person 
    Registry = {} 

    def sample_method 
    puts 'hello, world' 
    end 
end 

Person::Registry['jack'] = Person.new 

name = 'jack' # or you can use: name = gets.chomp  
person = Person::Registry.fetch(name) 
person.sample_method 

Использование eval с пользовательского ввода является опасным, поскольку она предоставляет пользователям все виды способов, которыми они могли случайно или злонамеренно испортить вашу программу. Я бы не нашел для eval в качестве первого инструмента для решения этой относительно простой проблемы.

0
class Person 
    def sampleMethod 
     puts "hello, world" 
    end 
end 

jack = Person.new 
input = "jack" 

Вы можете использовать eval для вызова объекта.

eval input 
=> #<Person:0x007f916ba16c20> 
eval input + ".sampleMethod" 
hello, world 
=> nil 

jack.object_id 
=> 70131276363280 
(eval input).object_id 
=> 70131276363280 

У них одинаковый идентификатор объекта, поэтому они называют тот же объект.

+1

Это очень плохой совет. Вы должны говорить OP, чтобы не делать этого. Возможно, приведу несколько примеров боли, которую он может нанести, и я не просто говорю о том, чтобы раздавать ключи от замка. Предположим, например, что у вас был класс «CEO», с дочерними VP и т. Д., Вплоть до «WorkerBees». Если бы руководителям было разрешено идентифицировать «WorkerBee's», которые должны были быть отправлены методом «admonish», определенным в «CEO», давайте просто надеемся, что ошибок орфографии не было. Правда, вы можете не делать этого в этом контексте, но всевозможные непреднамеренные последствия будут возможны, если пользователи смогут это сделать. –

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