Как я могу добавлять и извлекать элементы в Ruby Ha sh, используя читатели и сеттеры - PullRequest
1 голос
/ 23 апреля 2020

Я хочу иметь возможность добавлять и извлекать элементы на ха sh через геттеры и сеттеры. Вот мой класс

class Config

  attr_reader :p1, :p2, :p4

  def initialize(options={})
    options.each do |k,v|
      instance_variable_set("@#{k}", v)
    end
  end

end

В настоящее время я могу только добавлять и извлекать элементы с ключами как p1, p2 and p3

Если я пытаюсь добавить новые элементы, например

> a = Config.new({name: "kevin"})
return value is
=> #<Config:0x000000000a4422a8 @name="kevin">

при попытке доступа к имени

> a.name
NoMethodError: undefined method `name' for #<Config:0x000000000a4422a8 @name="kevin">

Как мне получить доступ к значению имени с помощью a.name, чтобы получить "Kevin"

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

Вы можете сделать:

class Config    
  def initialize(options={})
    options.each do |k,v|
      singleton_class.send(:attr_reader, k)
      instance_variable_set("@#{k}", v)
    end
  end
end

Это позволит вам определить различный набор читателей для каждого экземпляра класса Config (если это ваше намерение). Например:

c1 = Config.new(test1: "test1")
#=> #<Config:0x0000000c3a82c8 @test1="test1">
c2 = Config.new(test2: "test2")
#=> #<Config:0x0000000b7013d0 @test2="test2">
c1.test1
#=> "test1"
c1.test2
# NoMethodError: undefined method `test2' for #<Config:0x0000000c3a82c8 @test1="test1">
# from (pry):59:in `<main>'
c2.test2
#=> "test2"
c2.test1
# NoMethodError: undefined method `test1' for #<Config:0x0000000b7013d0 @test2="test2">
# from (pry):61:in `<main>'
2 голосов
/ 23 апреля 2020

Если вы хотите хранить только структуру данных, например, ха sh, возможно, вы можете попробовать OpenStruct

Например:

require 'ostruct'

class Config < OpenStruct
  # some other methods
end

Чем вы можете сделать это

hash_input = { name: "kevin", gender: "male" }
config = Config.new(hash_input)
config.name
#=> "kevin"

Для получения более подробной информации о OpenStruct, вы можете оформить заказ здесь

...