2010-09-23 20 views
9

PHPCreación de objetos en tiempo de ejecución en Ruby

<?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; 
?> 

¿Cómo puedo hacer esto en Ruby?

Respuesta

24

Si desea hacer una clase formal "dinámica", utilice 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" 

Para hacer que un objeto por completo en la marcha de un hash, utilice 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" 
+1

Lo que trata de hacer algo como 'Bob = Object.new'? –

3

Una de las muchas maneras de hacerlo es usar class_eval, define_method y así sucesivamente para construir una clase dinámicamente:

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 

A continuación, puede consumir esta clase después de la siguiente manera:

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

Pero no sería Rubí si sólo había una manera de hacerlo!

+2

tipo que es asqueroso! – horseyguy

+0

Es totalmente horrible, ¡estoy de acuerdo! Para ilustrar el hecho de que hay varias maneras diferentes de hacer las cosas, también estoy bastante seguro de que este es el tipo de cosas que 'Struct' y' OpenStruct' están haciendo bajo las sábanas. –

4

Uso OpenStruct:

require 'ostruct' 

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

my_object.name #=> "bob" 
my_object.phone #=> "555-1212" 
Cuestiones relacionadas