Ruby: 使用 class 的名称创建一个 class 对象?
Ruby: creating a class object using the name of the class?
请不要对我太苛刻,因为我对这个话题太陌生了,不知道如何提出问题(或搜索什么来获得答案):
我正在学习 Sinatra 中的嵌套表单,但遇到了与 Ruby 有关的一些我不理解的内容。
查看下面的代码片段——在尝试测试 rake console
中的代码时,我输入了 Team
,然后惊讶地看到创建了一个名为 "Team" 的对象.但是如果我输入 my_team = Team.new(params)
,我会收到一条错误消息 undefined local variable or method 'params' for main:Object
如果我输入其他任何内容,比如 'man',我会得到 NameError: undefined local variable or method 'man' for main:Object
为什么 class 的名称会导致 class 的实例?它不应该要求 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
在 Ruby 中,一切都是对象,因此 classes 是对象(并且它们是 class Class.
的实例
Team
是 class Class 的一个实例(缩写为 "a class"),而 Team.new
构建了 Team
的一个实例。 Class 的实例具有特定的行为,允许通过方法 #new
.
创建它们自己的实例
现在,传递给 ruby 方法的任何参数都必须在您当前的 binding 中定义,这意味着如果 params
未定义,则不允许您执行 Team.new(params)
马上蝙蝠。在访问之前定义一个局部变量(将进入绑定)很容易:
params = { team: { name: 'Whosebug' } }
Team.new(params)
会起作用。
我将该代码片段加载到 irb 中,Team
不是 return class Team
.
的实例
实例化Team
时传入的参数(params
)必须是某物;如果 params
当前不是分配给对象的局部变量,ruby 将拒绝实例化 Team
。
当您使用像 Rails 或 Sinatra 这样的框架时,params
是客户端(您的浏览器)在 HTTP 请求中发送到您的应用程序的哈希值。在这种情况下,当参数哈希命中您的应用程序时,它看起来像:
{:team => {:name => "Team 1's name"}}
您的应用中可能发生的情况是,用户在浏览器中单击 "Create Team" 之类的按钮,然后输入该表单的数据(例如 'Team Name')被放入 params
哈希。
如果您只是使用了您提供的纯 Ruby 代码并执行了 Team.new(params)
,那将等同于 Team.new(nil)
如果 params
不是' t 分配给任何东西。
顺便说一句,那是 Ruby 的一个非常酷的部分 - 它允许您对 Team.all
到 return 一系列以前创建的团队。
.all
是一个 Class 方法。如果你想了解更多关于 Class 方法,我有一个 little blog post on it.
希望对您有所帮助?如果需要,请随时提出更多问题。
请不要对我太苛刻,因为我对这个话题太陌生了,不知道如何提出问题(或搜索什么来获得答案):
我正在学习 Sinatra 中的嵌套表单,但遇到了与 Ruby 有关的一些我不理解的内容。
查看下面的代码片段——在尝试测试 rake console
中的代码时,我输入了 Team
,然后惊讶地看到创建了一个名为 "Team" 的对象.但是如果我输入 my_team = Team.new(params)
,我会收到一条错误消息 undefined local variable or method 'params' for main:Object
如果我输入其他任何内容,比如 'man',我会得到 NameError: undefined local variable or method 'man' for main:Object
为什么 class 的名称会导致 class 的实例?它不应该要求 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
在 Ruby 中,一切都是对象,因此 classes 是对象(并且它们是 class Class.
的实例Team
是 class Class 的一个实例(缩写为 "a class"),而 Team.new
构建了 Team
的一个实例。 Class 的实例具有特定的行为,允许通过方法 #new
.
现在,传递给 ruby 方法的任何参数都必须在您当前的 binding 中定义,这意味着如果 params
未定义,则不允许您执行 Team.new(params)
马上蝙蝠。在访问之前定义一个局部变量(将进入绑定)很容易:
params = { team: { name: 'Whosebug' } }
Team.new(params)
会起作用。
我将该代码片段加载到 irb 中,Team
不是 return class Team
.
实例化Team
时传入的参数(params
)必须是某物;如果 params
当前不是分配给对象的局部变量,ruby 将拒绝实例化 Team
。
当您使用像 Rails 或 Sinatra 这样的框架时,params
是客户端(您的浏览器)在 HTTP 请求中发送到您的应用程序的哈希值。在这种情况下,当参数哈希命中您的应用程序时,它看起来像:
{:team => {:name => "Team 1's name"}}
您的应用中可能发生的情况是,用户在浏览器中单击 "Create Team" 之类的按钮,然后输入该表单的数据(例如 'Team Name')被放入 params
哈希。
如果您只是使用了您提供的纯 Ruby 代码并执行了 Team.new(params)
,那将等同于 Team.new(nil)
如果 params
不是' t 分配给任何东西。
顺便说一句,那是 Ruby 的一个非常酷的部分 - 它允许您对 Team.all
到 return 一系列以前创建的团队。
.all
是一个 Class 方法。如果你想了解更多关于 Class 方法,我有一个 little blog post on it.
希望对您有所帮助?如果需要,请随时提出更多问题。