Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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_Gem_Parent_Specifications - Fatal编程技术网

Ruby 鲁比:如何推导;“当前”;宝石的名字?

Ruby 鲁比:如何推导;“当前”;宝石的名字?,ruby,gem,parent,specifications,Ruby,Gem,Parent,Specifications,我知道以下几点,以便获取Gem的审讯规范: spec = Gem::Specification.find_by_name('my_gem') 有没有一种方法可以通过编程识别“this”gem的名称,从而可以以可重用的方式重写上面的内容 换句话说,如何在运行时从一些正在执行的Ruby代码中获取父gem的名称?要找到当前源文件的gem规范(假设它是lib dir中的源文件): 您可以通过从您真正感兴趣的源文件中传入\uuuuu文件\uuuuuu或者通过检查调用方堆栈(但这可能不是一个好主意)使其可

我知道以下几点,以便获取Gem的审讯规范:

spec = Gem::Specification.find_by_name('my_gem')
有没有一种方法可以通过编程识别“this”gem的名称,从而可以以可重用的方式重写上面的内容


换句话说,如何在运行时从一些正在执行的Ruby代码中获取父gem的名称?

要找到当前源文件的gem规范(假设它是lib dir中的源文件):


您可以通过从您真正感兴趣的源文件中传入
\uuuuu文件\uuuuuu
或者通过检查调用方堆栈(但这可能不是一个好主意)使其可重用。

比方说,gem-Foo中的代码由gem-Bar调用。哪一个应该返回为“此宝石”?:)如果
Foo
包含“此gem”代码,则
Foo
else
Bar
。没有理由不提供这些信息,这完全取决于他们是否在gemapi中包含了该功能。由于代码是从gem加载的,ruby运行时可以很容易地知道执行上下文的父gem?哪一个是“父”gem?@Mark不管mixin/import/include场景有多复杂,运行时仍然可以知道包含父gem名称引用的执行上下文的父gem。由于运行时gem解析,这是可能的。因此,如果引用是在Foo中打印出来的,那么它将是
Foo
,如果是在Bar中,那么它将是
Bar
等等。正如我前面所说的,这仅仅取决于他们是否编写了运行时来提供这些信息。我想我试图说明的是,与类层次结构不同,没有Gem层次结构,没有“当前”创业板或“母公司”创业板的概念。因此,我不同意ruby运行时在执行上下文中可以很容易地意识到这一点的说法。
require 'rubygems'

searcher = if Gem::Specification.respond_to? :find
  # ruby 2.0
  Gem::Specification
elsif Gem.respond_to? :searcher
  # ruby 1.8/1.9
  Gem.searcher.init_gemspecs
end
spec = unless searcher.nil?
  searcher.find do |spec|
    File.fnmatch(File.join(spec.full_gem_path,'*'), __FILE__)
  end
end