2013-12-06 3 views
1

Как создать динамическое свойство в ruby? Эта функция существует в python.Динамические свойства в классе ruby ​​

class Example(object): 
    value = "This is property!" 

class Test(object): 
    @property 
    def check(self): 
     return Example 

test = Test() 
print(test.check.value) # This is property! 

Как я могу сделать то же самое в рубине?

+0

Рубин не имеют свойства. Можете ли вы уточнить, что вы хотите сделать для своего кода? Предпочтительно на языке, который могут понять рубисты (т. Е. Ruby), не каждый рубист отлично владеет языком Python. –

ответ

2
class Example 
    def value 
    "This is property!" 
    end 
end 

class Test 
    def check 
    Example.new 
    end 
end 

test = Test.new 
puts test.check.value # This is property! 
2
class Test 
    def check 
    "This is property!" 
    end 
end 

test = Test.new 
puts(test.check) # This is property! 
+0

Я знаю об этом решении. Но это метод, а не свойство. Я не могу так: 'test.check.again' – itdxer

1

Не уверен, что вы хотите от вашего примера. Свойства (из того, что я видел) обычно используются для создания сеттеров и геттеров. Вы можете иметь, что в Руби attr_accessor:

class Test 
    attr_accessor :check 
end 

Вы можете позвонить attr_accessor в любое время вы хотите атрибут:

class Test 
    %w{this are possible attribute names}.each do |att| 
    attr_accessor att 
    end 
end 

Или

Class Test 
end 

test = Test.new 
Test.send(:attr_accessor, :whatever) 
test.whatever = "something" 
test.whatever # => "something" 

Если вы хотите только геттер вы имеете attr_reader , и для писателя есть attr_writer. Все они для атрибута, называемого attribute_name, используют переменную экземпляра с именем @attribute_name. Все они могут быть построены с instance_variable_set и instance_variable_get, что позволяет динамически устанавливать и получать переменные экземпляра.

1

Вы можете использовать Руби method_missing, чтобы достичь чего-то подобное:

class TestCheck 
    def method_missing(methodId) 
    if(methodId.id2name == "check") 
     puts "check called" 
    else 
     puts "method not found" 
    end 
    end 

end 

t = TestCheck.new 
t.check  #=> "check called" 
t.something_else #=> "method not found" 

Ссылка: Ruby docs

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