2010-09-23 132 views
9

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中做到这一点?

回答

24

如果你想要做一个“动态”的正式上课,用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" 
+1

约做这样的事情'鲍勃= Object.new'什么? – 2010-09-23 03:15:41

3

其中一种方法是使用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' 

但它不会是红宝石,如果只有一个做到这一点的方式!

+2

哥们! – horseyguy 2010-09-23 07:03:05

+0

这是完全可怕的,我同意!只是说明有几种不同的做事方式 - 我也非常确定这是'Struct'和'OpenStruct'在封面下做的事情。 – 2010-09-23 15:54:29

4

使用OpenStruct:

require 'ostruct' 

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

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