- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在查看这个 boot.rb 文件:
http://github.com/bestbuyremix/BBYIDX/blob/master/config/boot.rb
在试图理解它之后,就好像到目前为止我什么都没学到。
有人可以详细说明这里发生了什么吗?
我不知道怎么会有人想出这个?
# Don't change this file!
# Configure your app in config/environment.rb and config/environments/*.rb
RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
module Rails
class << self
def boot!
unless booted?
preinitialize
pick_boot.run
end
end
def booted?
defined? Rails::Initializer
end
def pick_boot
(vendor_rails? ? VendorBoot : GemBoot).new
end
def vendor_rails?
File.exist?("#{RAILS_ROOT}/vendor/rails")
end
def preinitialize
load(preinitializer_path) if File.exist?(preinitializer_path)
end
def preinitializer_path
"#{RAILS_ROOT}/config/preinitializer.rb"
end
end
class Boot
def run
load_initializer
Rails::Initializer.run(:set_load_path)
end
end
class VendorBoot < Boot
def load_initializer
require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
Rails::Initializer.run(:install_gem_spec_stubs)
end
end
class GemBoot < Boot
def load_initializer
self.class.load_rubygems
load_rails_gem
require 'initializer'
end
def load_rails_gem
if version = self.class.gem_version
gem 'rails', version
else
gem 'rails'
end
rescue Gem::LoadError => load_error
$stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
exit 1
end
class << self
def rubygems_version
Gem::RubyGemsVersion if defined? Gem::RubyGemsVersion
end
def gem_version
if defined? RAILS_GEM_VERSION
RAILS_GEM_VERSION
elsif ENV.include?('RAILS_GEM_VERSION')
ENV['RAILS_GEM_VERSION']
else
parse_gem_version(read_environment_rb)
end
end
def load_rubygems
require 'rubygems'
min_version = '1.1.1'
unless rubygems_version >= min_version
$stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.)
exit 1
end
rescue LoadError
$stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org)
exit 1
end
def parse_gem_version(text)
$1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
end
private
def read_environment_rb
File.read("#{RAILS_ROOT}/config/environment.rb")
end
end
end
end
# All that for this:
Rails.boot!
最佳答案
如果您正在学习 Rails,这不是学习的好地方。也许您有这样的想法,为了使用它,您需要从一开始就了解代码的流程?不要那样做。 :)
如果您正在学习 Rails,请使用许多指南和教程中的任何一个来构建一个基本站点。
至于这段代码,它使用的一些概念涉及ruby的标志性class << self
。这是对元类的批判性阅读:http://yehudakatz.com/2009/11/15/metaprogramming-in-ruby-its-all-about-the-self/
Rails.boot!
在底部引导您得出结论“方法 boot!
在对象 Rails
上被调用......回到顶部,您会看到
module Rails
class << self
def boot!
unless booted?
preinitialize
pick_boot.run
end
end
...
在这里你可以看到背后的魔力class << self
...它创建了 boot!
模块本身的方法。从那里你可以跟踪整个文件的方法调用,因为它检查预初始化文件的存在......
pick_boot
返回一个对象,VendorBoot
或 GemBoot
取决于 vendor_rails?
的结果然后调用run
方法。
从那里你有一些标准的类继承 Boot
类,因为它设置了其余的库。希望这能让你开始。 :)
这实际上是非常好的 OO 风格……小方法和类都完成一个简单的任务。还有 OO 继承和几个常见的 ruby 习语。总而言之,一段非常好的 ruby 代码。 :)
更新
如果以更程序化的风格编码,下面是它的粗略估计:
RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)unless defined? Rails::Initializer preinitializer_path = "#{RAILS_ROOT}/config/preinitializer.rb" load() if File.exist?(preinitializer_path) if File.exist?("#{RAILS_ROOT}/vendor/rails") require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer" Rails::Initializer.run(:install_gem_spec_stubs) Rails::Initializer.run(:set_load_path) else begin require 'rubygems' min_version = '1.1.1' rubygems_version = Gem::RubyGemsVersion if defined? Gem::RubyGemsVersion unless rubygems_version >= min_version $stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.) exit 1 end rescue LoadError $stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org) exit 1 end begin if defined? RAILS_GEM_VERSION version = RAILS_GEM_VERSION elsif ENV.include?('RAILS_GEM_VERSION') version = ENV['RAILS_GEM_VERSION'] else version = $1 if (File.read("#{RAILS_ROOT}/config/environment.rb")) =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~=]*\s*[\d.]+)["']/ end if version gem 'rails', version else gem 'rails' end rescue Gem::LoadError => load_error $stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.) exit 1 end require 'initializer' endend
关于ruby-on-rails - 学习 RoR,有人可以从 H**ll 解释这个 boot.rb 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4046338/
为了进一步了解解析器和语法,我正在寻找 LL(2) 但不是 LL(1) 的语言示例(希望是简单的)。也就是说,一种可以由 LL(2) 语法生成但不能由任何 LL(1) 语法生成的语言。 该类(clas
$ cat png.ll ./packages/apps/Mms/res/mipmap-hdpi/ic_launcher_smsmms.png ./packages/apps/Mms/res/draw
我最近试图自学解析器(用于语言/上下文无关语法)如何工作,除了一件事之外,大多数内容似乎都是有意义的。我特别关注 LL(k) 语法,其中两个主要算法似乎是 LL parser (使用堆栈/解析表)和
我正在研究上下文无关语法,并且我陷入了第一步:了解自顶向下解析算法的结构。 我的问题围绕自上而下的解析器。我向我介绍了三种算法: 递归下降 预测性 预测递归下降 问题 但不明白如何将它们联系起来。所以
我有三种语法: A -> aB |乙| CBB B -> aB |巴| aBb C -> aaA |乙| caB 我需要“通过执行成对不相交测试来确定[它们]是否是 LL 语法,显示每个非终结符的每个
我已经在转换它上浪费了很多时间,但我总是起床得到公共(public)前缀 ID。 谁能给我解释一下?因为我正在尝试为一个非常大的语法做这件事并且需要我的基础知识清楚。 A、B、C、D 是仅有的非终结符
如果我定义了以下结构: typedef struct bear_t { char* name; void (*eat)(struct bear_t* this); void (
我在 Internet 上找不到任何关于 LL(*) 解析器的完整描述,例如 ANTLR。 我想知道 LL(k) 解析器和 LL(*) 解析器之间的区别是什么,以及为什么它们不支持左递归语法,尽管它们
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
LL 是否在标准中的任何地方定义(很难找到)? ideone接受代码 int main() { std::cout int main() { // Won't fire st
我的任务是将此语法转换为 LL(1) E → E+E | E-E | E*E | E/E | E^E | -E | (E)| id | num 所以对于第一步,我消除了歧义并得到了这个: E → E+
我了解 LL 递归下降解析器如何处理这种形式的规则: A = B*; 使用一个简单的循环,根据前瞻标记是否与 B 的第一组中的终端匹配来检查是否继续循环。但是,我对基于表的 LL 解析器很好奇:这种形
我有以下语法: S → a S b S | b S a S | ε 由于我正在尝试为其编写一个小型编译器,因此我想将其设为 LL(1)。我看到这里似乎存在 FIRST/FOLLOW 冲突,我知道我必须
我有一个语法,我可以检查 is 是否是 LL(1)。但是,有什么方法可以检查语法生成的语言是否为LL(1)? LL(1) 语法和 LL(1) 语言之间到底有什么区别? 最佳答案 任何 LL(1) 语法
好吧,我所说的 LL(k) 语言是指其解析器可以用 LL(k) 语法描述的编程语言。 这些是我的猜测: 帕斯卡 口齿不清 xml 和 friend 最佳答案 这取决于“语言”的定义。如果你问 What
我想解析一种编程语言。我读了很多关于形式语言、乔姆斯基层次结构和 ANTLR 的内容。但我找不到有关如何将 ANTLR v3 作为 LL(*) 递归下降解析器接受的语言与乔姆斯基层次结构相关联的信息。
我似乎无法弄清楚为什么在双向链表的末尾插入节点会陷入循环。要么陷入循环,要么陷入空指针。另外我想知道在处理链表或任何数据结构时 public Node 更好还是 public void 更好。 pub
我有一个程序,当前将生成 token 输出,用于下一个程序的输入。它将检查代码语法的正确性。 我遇到了如何开始将此语法转换为可用程序的问题。 下面是语法使用,我将如何着手制作它。或者哪里有好的资源可以
这个问题已经存在: Hello, it shows me two letter "L",but i would like to see full letters like "hello" but in
我正在尝试编译一个有 -ll 标志但 gcc 找不到的程序。 -l 之后的 l 是什么,真的是一个库还是错字?很难在谷歌上找到关于这个的信息。这样的术语是“模糊的”。 最佳答案 -ll 表示链接Sol
我是一名优秀的程序员,十分优秀!