Создание объектов во время выполнения в Ruby - PullRequest
9 голосов
/ 23 сентября 2010

PHP

<?php
$dynamicProperties = array("name" => "bob", "phone" => "555-1212");
$myObject = new stdClass();
foreach($dynamicProperties as $key => $value) {
    $myObject->$key = $value;
}
echo $myObject->name . "<br />" . $myObject->phone;
?>

Как мне это сделать в ruby?

Ответы [ 3 ]

27 голосов
/ 23 сентября 2010

Если вы хотите создать «динамический» формальный класс, используйте Struct :

>> Person = Struct.new(:name, :phone)
=> Person
>> bob = Person.new("bob", "555-1212")
=> #<struct Person name="bob", phone="555-1212">
>> bob.name
=> "bob"
>> bob.phone
=> "555-1212"

Чтобы сделать объект полностью на лету изхеш, используйте OpenStruct :

>> require 'ostruct'
=> true
>> bob = OpenStruct.new({ :name => "bob", :phone => "555-1212" })
=> #<OpenStruct phone="555-1212", name="bob">
>> bob.name
=> "bob"
>> bob.phone
=> "555-1212"
6 голосов
/ 23 сентября 2010

Использовать OpenStruct:

require 'ostruct'

data = { :name => "bob", :phone => "555-1212" }
my_object = OpenStruct.new(data)

my_object.name #=> "bob"
my_object.phone #=> "555-1212"
4 голосов
/ 23 сентября 2010

Один из многих способов сделать это - использовать class_eval, define_method и т. Д. Для динамического создания класса:

dynamic_properties = {
  'name' => 'bob',
  'phone' => '555-1212'
}

class_instance = Object.const_set('MyClass', Class.new)
class_instance.class_eval do
  define_method(:initialize) do
    dynamic_properties.each do |key, value|
      instance_variable_set("@#{key}", value);
    end
  end

  dynamic_properties.each do |key, value|
    attr_accessor key
  end
end

Затем этот класс можно использовать позже следующим образом:

>> my_object = MyClass.new
>> puts my_object.name
=> 'bob'
>> puts my_object.phone
=> '555-1212'

Но Руби не было бы, если бы был только один способ сделать это!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...