1

Ruby モジュールを使用して、一連の構成の既定値を保存したいと考えています。

値の使用に問題があり、誰かが助けてくれることを願っています。

これはこれを行うための最良の方法ではないかもしれませんが、これが私がこれまでに思いついたことです。

個人の Resume => resume.rb の値を保持するモジュールを次に示します。

module Resume
  require 'ostruct'

  attr_reader :personal, :education

  @personal = OpenStruct.new

  @education = Array.new

  def self.included(base)
    set_personal
    set_education
  end

  def self.set_personal
    @personal.name          = "Joe Blogs"
    @personal.email_address = 'joe.blogs@gmail.com'
    @personal.phone_number  = '5555 55 55 555'
  end

  def self.set_education
    @education << %w{ School\ 1 Description\ 1 }
    @education << %w{ School\ 2 Description\ 2 }
  end
end

irb からは正常に動作します:

% irb -I .
1.9.3-p194 :001 > require 'resume'
 => true 
1.9.3-p194 :002 > include Resume
 => Object 
1.9.3-p194 :003 > puts Resume.personal.name
Joe Blogs
 => nil 

ただし、これをクラスに含めると、エラーがスローされ、エラー => build.rb

require 'resume'

class Build
  include Resume

  def build
    puts Resume.personal.name
  end
end

irb より:

% irb -I .
1.9.3-p194 :001 > require 'build'
 => true 
1.9.3-p194 :002 > b = Build.new
 => #<Build:0x00000001d0ebb0> 
1.9.3-p194 :003 > b.build
NoMethodError: undefined method `personal' for Resume:Module
    from /home/oolyme/projects/lh_resume_builder_ruby/build.rb:7:in `build'
    from (irb):3
    from /home/oolyme/.rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in `<main>'

Build クラス インスタンスにインクルード モジュール変数を出力するためにいくつかのバリエーションを試しましたが、すべてエラーになります。

4

1 に答える 1

0

attr_accessor creates a couple of instance methods, meaning that they will be available on an instance of Build. But you clearly want class instance methods. Change definition of your module to this:

module Resume
  require 'ostruct'

  def self.personal
    @personal
  end

  def self.education
    @education
  end

  def self.included(base)
    @personal = OpenStruct.new
    @education = Array.new

    set_personal
    set_education
  end

  def self.set_personal
    @personal.name          = "Joe Blogs"
    @personal.email_address = 'joe.blogs@gmail.com'
    @personal.phone_number  = '5555 55 55 555'
  end

  def self.set_education
    @education << %w{ School\ 1 Description\ 1 }
    @education << %w{ School\ 2 Description\ 2 }
  end
end

And it'll work

b = Build.new
b.build # >> Joe Blogs
于 2012-11-19T05:33:04.313 に答える