我需要初始化一些我真正不知道的东西';我以前不知道它在Ruby中是什么
让我试着解释一下我需要什么,然后也许有人会告诉我怎么做 我的系统中有一系列的实体。它们列在一个数组中我需要初始化一些我真正不知道的东西';我以前不知道它在Ruby中是什么,ruby,class,Ruby,Class,让我试着解释一下我需要什么,然后也许有人会告诉我怎么做 我的系统中有一系列的实体。它们列在一个数组中 @entities = [ :component, :email, :form, :library, :page, :project, :resource, :template ] 我使用解析命令行,然后在opts散列中获取所有解析的选项,并在args数组中获取剩余的命令行参数 args数组的第一个元素始终是我需要创建的实体,以处理命令行输入。为了这个推理,让我们假设我正在创建一个:项目 现在
@entities = [ :component, :email, :form, :library, :page, :project, :resource, :template ]
我使用解析命令行,然后在opts散列中获取所有解析的选项,并在args数组中获取剩余的命令行参数
args数组的第一个元素始终是我需要创建的实体,以处理命令行输入。为了这个推理,让我们假设我正在创建一个:项目
现在,我有一个文件project.rb,其中包含:
entity_block = lambda { |ent|
ent.entity_type = :project
# All other initialization options
.
.
.
}
在我的主要模块中,我有以下方法:
def self.start(args,opts)
# Saves arguments and options
@arguments = args
@options = opts
# Isolates the entity which will handle the command line request
@entity = @arguments[0]
exit_error(103,@entites) if not @entities.include?(@entity.to_sym)
# Requires the correct block for the entity type
require "entities/#{@entity}"
# Creates the entity class
EmeraldFW::Entity.new(@arguments,@options) do
entity_block
end
end
这是我的entity.rb文件:
module EmeraldFW
class Entity
attr_accessor :entity_type, :entity_base_dir
def initialize(args,opts)
@args = args
@opts = opts
end
def execute
puts entity_base_dir
puts "Do something..."
end
end
end
正如您所看到的,我打算做的是在.rb
文件中,需要包含特定实体的特定初始值的文件
例如,想法是在运行代码后初始化实体类型
。不仅是his,还包括识别用户在命令行中提到的特定实体所需的所有其他参数
碰巧这不起作用。如果是的话,我当然不会在这里打扰你
我尝试使用#点击
将新创建的实体对象注入由实体(u块
定义的lambda块中,如下所示:
EmeraldFW::Entity.new(@arguments,@options).tap do
entity_block
end
我也试着这样做&entity\u block
EmeraldFW::Entity.new(@arguments,@options).tap do
&entity_block
end
小结:那么,我的问题是如何以友好的方式创建实体?
当然,我考虑过这样做的可能性
entity_class = "EmeraldFW::#{@entity.capitalize}".split('::').inject(Object) {|o,c| o.const_get c}.new(@arguments,@options)
但首先,我想知道这另一种方式是否可行,以及我在这里遗漏了什么
顺便说一下,这是我经常遇到的错误:
/home/edvaldo/software/github/emeraldfw21/lib/emeraldfw.rb:34:in `block in start': undefined local variable or method `entity_block' for EmeraldFW:Module (NameError)
entity\u block
是project.rb
中的局部变量。局部变量无法通过require
生存。您必须定义常量(实体块
)、模块(实体
)、实例变量(@ENTITY\u块
)或全局变量($ENTITY\u块
)
其中,模块(或类,作为一种特殊的模块)是最好的。
实体块
是项目.rb中的局部变量。局部变量无法通过require
生存。您必须定义常量(实体块
)、模块(实体
)、实例变量(@ENTITY\u块
)或全局变量($ENTITY\u块
)
其中,一个模块(或一个类,作为一种特殊的模块)是最好的。如果entity\u block
是一个proc或lambda,如果您只键入它的名称而不加括号,它将不会被调用(不同于将被调用的典型方法)
所以我认为你的问题是你的街区永远不会被调用
请尝试以下方法:
entity = EmeraldFW::Entity.new(@arguments,@options)
entity_block.call(entity)
# similarly
entity.instance_eval { entity_block.call(self) }
顺便说一句,关于您使用点击——看起来您试图实现一些动态范围,但这对您来说是行不通的。如果你问我的话,这实际上只是分配变量的语法糖。要获取块的动态范围,可以使用class\u exec
或instance\u exec
。但是,如果您显式地将对象作为参数传递,并且不尝试重新定义self
如果实体块
是一个proc或lambda,则不需要执行此操作。如果您只键入它的名称而不使用括号,则不会调用它(与将调用的典型方法不同)
所以我认为你的问题是你的街区永远不会被调用
请尝试以下方法:
entity = EmeraldFW::Entity.new(@arguments,@options)
entity_block.call(entity)
# similarly
entity.instance_eval { entity_block.call(self) }
顺便说一句,关于您使用点击——看起来您试图实现一些动态范围,但这对您来说是行不通的。如果你问我的话,这实际上只是分配变量的语法糖。要获取块的动态范围,可以使用class\u exec
或instance\u exec
。但是,如果您显式地将对象作为参数传递,并且不尝试重新定义self
您的示例将实体块传递到点击
看起来可疑,那么这样做是不必要的,您能更明确地说明这应该实现什么吗?是否尝试将某个对象作为块中的self
的值传递,或者该块是作为参数传递的参数?我想将新创建的实体对象传递给Entity\u block
中的块。这对我来说也很可疑。我不确定这是实现我需要的正确方法。简而言之,我需要的是创建一个实体对象,其属性是命令行中提到的实体的属性。我编辑了这个问题以更好地解释,@maxpleaner。您将实体块传递给点击的示例看起来可疑,你能不能更明确一点,这应该达到什么目的?是否尝试将某个对象作为块中的self
的值传递,或者该块是作为参数传递的参数?我想将新创建的实体对象传递给Entity\u block
中的块。这对我来说也很可疑。我不确定这是否是实现我所需的正确方法。简而言之,我需要创建一个实体对象,其属性是命令行中提到的实体的属性。我编辑了这个问题以更好地解释,@maxpleaner。我理解。我会努力做到这一点。谢谢。它奏效了,但我真的不知道我应该投什么票,因为我在这里的解决方案中使用了这两种方法。我理解。我会努力做到这一点。谢谢。它起作用了,但我不知道我应该投什么票,因为我在这里的解决方案中都用了。它起作用了,但我不知道我应该投什么票,因为我在这里的解决方案中都用了。它起作用了,但我真的不知道我应该投什么票,因为我在这里的解决方案中都用了。