Ruby:使用类的名称创建一个类对象?

时间:2016-05-28 23:42:58

标签: ruby sinatra

请不要过于严厉地评价我,因为我对这个话题很新,我不知道如何提问(或者搜索什么来获得答案):

我正在学习Sinatra中的嵌套表单,但遇到了一些我不理解的与Ruby相关的内容。

请参阅下面的代码段 - 尝试在rake console中测试代码时,我输入了Team,并且惊讶地看到使用名称“Team”创建的对象。但是,如果我输入my_team = Team.new(params),我会收到undefined local variable or method 'params' for main:Object

的错误消息

如果我输入其他任何内容,请说“男人”,我会NameError: undefined local variable or method 'man' for main:Object

为什么类的名称会导致类的实例?它不应该Class_name.new创建一个对象吗?

class Team

  attr_accessor :name
    TEAM = []

    def initialize(params)
      @name = params[:team][:name]
      TEAM << self
    end

    def self.all
      TEAM
    end
end

2 个答案:

答案 0 :(得分:2)

在Ruby中,一切都是对象,因此类是对象(它们是类Class的实例。

Team是类Class的实例(缩写为“a class”),而Team.new构建Team的实例。类的实例具有某种行为,允许通过方法#new创建自己的实例。

现在,传递给ruby中方法的任何参数都必须在当前binding中定义,这意味着如果params未定义,则不允许您立即执行Team.new(params) 。在访问之前定义局部变量(将进入绑定)很容易:

params = { team: { name: 'StackOverflow' } }
Team.new(params)

会奏效。

答案 1 :(得分:1)

我将该代码段加载到irb中,Team不会返回类Team的实例。

实例化params时传入的参数(Team)必须是某种东西;如果params当前不是分配给对象的局部变量,则ruby将拒绝实例化Team

当您使用Rails或Sinatra等框架时,params是客户端(您的浏览器)在HTTP请求中发送到您的应用程序的哈希值。在这种情况下,当params哈希命中您的应用程序时,它看起来像:

{:team => {:name => "Team 1's name"}}

您的应用中可能发生的情况是用户在浏览器中点击“创建团队”之类的按钮,输入该表单的数据(例如“团队名称”)会被放入params哈希

如果您刚刚使用了自己提供的纯Ruby代码并且刚刚执行了Team.new(params),那么如果Team.new(nil)未分配给任何内容,则相当于params。< / p>

顺便说一下,这是一个相当酷的Ruby - 它允许你Team.all返回一组先前创建的团队。

.all是一种类方法。如果您想更多地了解类方法,我有一个little blog post on it

希望这一切有帮助吗?如果你愿意,可以随意提出更多问题。