首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Ruby中自制类似公式的对象创建

在Ruby中自制类似公式的对象创建
EN

Stack Overflow用户
提问于 2013-08-28 18:11:54
回答 1查看 80关注 0票数 0

我希望通过扩展类(如自制软件中的类)在Ruby中创建一个对象:

代码语言:javascript
运行
复制
class Somepackage < Formula
    version "2.8"
    homepage "http://foo.bar.com/"
end

然而,我是一个Ruby新兵,我找不到一种方法来定义适合我需要的Formula类:

代码语言:javascript
运行
复制
class Formula
    attr_reader :version, :homepage
    def self.version (version)
        @version = version
    end
end

这显然是行不通的:

代码语言:javascript
运行
复制
Somepackage.version #=> nil

(我需要它返回2.8)

我知道这一定是一件非常简单的事情,但我尝试了各种组合,但就是做不到。

更新

好的,感谢塞尔吉奥的回答,最后的版本如下:

代码语言:javascript
运行
复制
def property(*properties)
  properties.each do |prop|
    self.class_eval("def self.#{prop}(#{prop} = nil); @#{prop} = #{prop} if #{prop}; @#{prop}; end")
  end
end

class Formula
    property :version, :homepage
end

class Somepackage < Formula
   version "2.8"
   homepage "http://foo.bar.com/"
end
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-28 18:20:28

注意,您的attr_reader方法位于实例级别。要打电话给他们你就得这么做

代码语言:javascript
运行
复制
Somepackage.new.version

这显然不是你的意图。你可以像这样把他们提升到班级级别:

代码语言:javascript
运行
复制
class Formula
  class << self
    attr_reader :version, :homepage
  end

  def version(version)
    @version = version
  end
end

但这里也有个问题。第二个版本的version覆盖了来自attr_readerversion。因此,您有一个可以设置值但不能返回的方法。在做了一些实验之后,你最终会得到这样的结果:

代码语言:javascript
运行
复制
class Formula
  def self.version(version = nil)
    if version
      @version = version
    end

    @version
  end
end

class Somepackage < Formula
  version "2.8"
end

Somepackage.version # => "2.8"

homepage制作您自己的版本。或者,更好的是,编写一个生成这些方法的方法,这样您就可以这样做了。

代码语言:javascript
运行
复制
class Formula
  property :version, :homepage
end
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18495270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档