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;
?>
Run Code Online (Sandbox Code Playgroud)
我如何在ruby中执行此操作?
Mar*_*off 30
如果要创建"动态"正式类,请使用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"
Run Code Online (Sandbox Code Playgroud)
要从哈希中完全动态创建对象,请使用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"
Run Code Online (Sandbox Code Playgroud)
使用OpenStruct:
require 'ostruct'
data = { :name => "bob", :phone => "555-1212" }
my_object = OpenStruct.new(data)
my_object.name #=> "bob"
my_object.phone #=> "555-1212"
Run Code Online (Sandbox Code Playgroud)
执行此操作的许多方法之一是使用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
Run Code Online (Sandbox Code Playgroud)
然后你可以稍后使用这个类,如下所示:
>> my_object = MyClass.new
>> puts my_object.name
=> 'bob'
>> puts my_object.phone
=> '555-1212'
Run Code Online (Sandbox Code Playgroud)
但如果只有一种方法,那就不是 Ruby 了!