Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我需要初始化一些我真正不知道的东西';我以前不知道它在Ruby中是什么_Ruby_Class - Fatal编程技术网

我需要初始化一些我真正不知道的东西';我以前不知道它在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。我理解。我会努力做到这一点。谢谢。它奏效了,但我真的不知道我应该投什么票,因为我在这里的解决方案中使用了这两种方法。我理解。我会努力做到这一点。谢谢。它起作用了,但我不知道我应该投什么票,因为我在这里的解决方案中都用了。它起作用了,但我不知道我应该投什么票,因为我在这里的解决方案中都用了。它起作用了,但我真的不知道我应该投什么票,因为我在这里的解决方案中都用了。