【问题标题】:Creating a new variable automatically - Generating a variable - Ruby自动创建新变量 - 生成变量 - Ruby
【发布时间】:2018-09-08 19:47:50
【问题描述】:

元信息:找到了类似的帖子,Ruby 的帖子为零。 使用多个搜索可访问性术语创建标题

好的,现在进入问题... 我正在尝试自动生成新变量(moreso),我想创建一个这样做的机制。

class User
  attr_accessor :name

  def initialize(name)
  @name = name
  end

end

def CreateUser(name)
  name = User.new(name)
end

CreateUser("Arnold")
p Arnold

我在方法“CreateUser”的名称参数中使用了一个参数作为我要声明的变量的名称以及发送到创建我的类成员的代码中的信息。

我很快就记起来了,在 Ruby 中,方法中的变量只对方法是局部的。如果不是这种情况,并且我可以从方法中吐出新变量,那么我可以轻松地生成我的用户 - 但事实并非如此。有解决办法吗?还是手动声明一个新变量只是游戏名称?

【问题讨论】:

  • 您是否希望 Arnold 成为自己的常量,例如您的示例中出现的类/结构?如果是这样,有几种不同的方法可以实现这一点。 Arnold 应该是User 的一个实例,还是它自己的从User 派生的类?
  • 手动声明一个新变量确实是“游戏名称”的真相。从技术上讲,您可以使用Object.const_set 在任何地方定义一个新的全局变量,但这不是一个好习惯。如果您有同名的用户怎么办?您只能让变量指向其中之一。如果用户的名称与另一个常量冲突(例如,某个名为“String”的人)怎么办?通常常量(以大写字母开头的变量)无论如何都不是动态定义的,它与“常量”的概念有点冲突
  • 自 Ruby 版本 1.8.7 以来,无法动态创建局部变量;实例变量,是的,局部变量,不是。
  • ForeverZer0 - Arnold 应该是 User MaxPleaner 的一个实例 - 那么,如果我创建一个不同的机制来创建变量名呢?说一个 random_ID_generator 方法,它创建一个随机的字母/数字字符串,它还检查它是否是唯一的?那样的东西不会起作用吗?我想了解有关 Object.const_set 的更多信息,因为它听起来像我正在寻找的东西。卡里 - 我明白了。

标签: ruby variables metaprogramming generate


【解决方案1】:

您的问题有点令人困惑。乍一看,您似乎正在寻找一些元编程技术来动态创建实例变量,例如:

class User
  def new_variable name, value
      instance_variable_set "@#{name}", value
  end
end

但是,在更仔细地研究您实际尝试解决的问题时,似乎真正的问题是您没有将方法作为原始对象的一部分。这可能是你真正想要的:

class User
  attr_accessor :name

  def initialize name
    @name = name
  end 

  def create_user
    # do whatever you need to do to "create" a user
    pp name
  end
end

u = User.new 'Arnold'
u.create_user

使对象能够对存储在对象中的数据调用实例方法是封装的一部分。这很可能是您真正追求的。

【讨论】:

  • 嗯,不完全是,您仍然通过编写 u = User.new 来声明变量...这就是我试图避免的。我基本上是在寻找一种在不声明变量的情况下生成变量的方法。就像工厂传送带一样,每次调用某种方法时,它可以一个接一个地将它们抽出。我知道必须有一种方法,因为每次创建新用户时,他们都会在框架中执行此操作,使用 C.R.U.D. 的 Create 函数,不是吗?
  • @Nick No. 指向执行此操作的框架。如果您的意思是要创建一个 User 对象并稍后分配一个名称,因为 name 是可选的,那是一回事。如果你的意思是你想创建一个具有动态成员的对象,也许看看 OpenStruct。
  • @Nick 大多数具有“CRUD”逻辑的框架都使用数据存储(例如数据库或文件)来“创建”。这些对象的生命周期往往是短暂的,而它们的数据通过存储设施保持永久性,并且可以通过数据检索机制(查询、解析等)重新实例化
猜你喜欢
  • 1970-01-01
  • 2016-08-31
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2013-08-18
  • 1970-01-01
  • 2016-11-15
  • 2013-12-21
相关资源
最近更新 更多