`
dtrex
  • 浏览: 139599 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ruby中的autoload(转载)

阅读更多

http://hooopo.iteye.com/blog/604975

autoload可以加载(注册)任何模块的类或常量,不能有::操作符的...
特别广泛应用在如下代码结构:

Ruby代码
  1. #rack.rb   
  2. #这样的文件结构ruby源码里随处可见   
  3. module  Rack  
  4.   autoload :Builder, "rack/builder"   
  5.   autoload :Cascade, "rack/cascade"   
  6.   autoload :Chunked, "rack/chunked"   
  7.   autoload :CommonLogger, "rack/commonlogger"   
  8.   autoload :ConditionalGet, "rack/conditionalget"   
  9.   autoload :Config, "rack/config"   
  10.   ...  
  11. end   
  12. autoload本质是会调用Kernel.require,但是又和require有区别。  
  13. 可以说autoload是一个smart的require...比require更加智能灵活。Just-in - Time ..  
  14. 几个简单的例子:  
  15.   
  16. 要被require的文件,mylibrary.rb  
  17. <pre name="code"   class = "ruby" >puts  "I was loaded!"   
  18.   
  19. class  MyLibrary  
  20. end </pre>  
  21. <br>require mylibrary时文件立即执行。  
  22. <br><pre name="code"   class = "irb" >irb(main):001:0> require  'mylibrary'   
  23. I was loaded!  
  24. => true   
  25. </pre>  
  26. <br>  
  27. <br>使用autoload,只有使用到需要的常量或类文件才被加载。。我们真正需要用某个文件时才加载,而require是直接加载,不管你是否会用到。  
  28. <br><pre name="code"   class = "ruby" >irb(main):001:0> autoload :MyLibrary,  'mylibrary'   
  29. => nil   
  30. irb(main):002:0> MyLibrary.new   
  31. I was loaded!  
  32. => #<MyLibrary:0x0b1jef></pre>   
  33. <br>  
  34. <br>其实,我觉得require更实用一些。。预先一次性加载来的痛快嘛。。  
  35. <br>这个作者举了一个实例的例子来说明autoload的应用场景:<a href="http://www.subelsky.com/2008/05/using-rubys-autoload-method-to.html"  target= "_blank" >http://www.subelsky.com/2008/05/using-rubys-autoload-method-to.html</a>  
  36. <br>  
  37. <br>  
  38. <br>  
  39. <br>  
#rack.rb
#这样的文件结构ruby源码里随处可见
module Rack
  autoload :Builder, "rack/builder"
  autoload :Cascade, "rack/cascade"
  autoload :Chunked, "rack/chunked"
  autoload :CommonLogger, "rack/commonlogger"
  autoload :ConditionalGet, "rack/conditionalget"
  autoload :Config, "rack/config"
  ...
end
autoload本质是会调用Kernel.require,但是又和require有区别。
可以说autoload是一个smart的require...比require更加智能灵活。Just-in-Time..
几个简单的例子:

要被require的文件,mylibrary.rb
Ruby代码
  1. puts  "I was loaded!"   
  2.   
  3. class  MyLibrary  
  4. end   
puts "I was loaded!"

class MyLibrary
end

require mylibrary时文件立即执行。
Irb代码
  1. irb(main): 001 : 0 > require  'mylibrary'   
  2. I was loaded!  
  3. => true  
irb(main):001:0> require 'mylibrary'
I was loaded!
=> true


使用autoload,只有使用到需要的常量或类文件才被加载。。我们真正需要用某个文件时才加载,而require是直接加载,不管你是否会用到。
Ruby代码
  1. irb(main):001:0> autoload :MyLibrary,  'mylibrary'   
  2. => nil   
  3. irb(main):002:0> MyLibrary.new   
  4. I was loaded!  
  5. => #<MyLibrary:0x0b1jef>   
irb(main):001:0> autoload :MyLibrary, 'mylibrary'
=> nil
irb(main):002:0> MyLibrary.new
I was loaded!
=> #<MyLibrary:0x0b1jef>


其实,我觉得require更实用一些。。预先一次性加载来的痛快嘛。。
这个作者举了一个实例的例子来说明autoload的应用场景:http://www.subelsky.com/2008/05/using-rubys-autoload-method-to.html






link:http://www.rubyinside.com/ruby-techniques-revealed-autoload-1652.html
link:http://www.ruby-doc.org/core/classes/Kernel.html#M005968
link:http://www.ruby-forum.com/topic/172385
link:http://www.subelsky.com/2008/05/using-rubys-autoload-method-to.html

 


trap

Ruby代码
  1. trap( "SIGINT" do   
  2.   irb.signal_handle  
  3. end   
trap("SIGINT") do
  irb.signal_handle
end



捕捉信号量。然后执行block

Ruby代码
  1. Signal.trap(0, proc { puts  "Terminating: #{$$}"  })  
  2. Signal.trap("CLD" )  { puts  "Child died"  }  
Signal.trap(0, proc { puts "Terminating: #{$$}" })
Signal.trap("CLD")  { puts "Child died" }




test:

Ruby代码
  1. #     test(int_cmd, file1 [, file2] ) => obj   
  2.   #   
  3.   #   
  4.   # Uses the integer <i>aCmd</i> to perform various tests on   
  5.   # <i>file1</i> (first table below) or on <i>file1</i> and   
  6.   # <i>file2</i> (second table).   
  7.   #   
  8.   # File tests on a single file:   
  9.   #   
  10.   #   Test   Returns   Meaning   
  11.   #    ?A  | Time    | Last access time for file1   
  12.   #    ?b  | boolean | True if file1 is a block device   
  13.   #    ?c  | boolean | True if file1 is a character device   
  14.   #    ?C  | Time    | Last change time for file1   
  15.   #    ?d  | boolean | True if file1 exists and is a directory   
  16.   #    ?e  | boolean | True if file1 exists   
  17.   #    ?f  | boolean | True if file1 exists and is a regular file   
  18.   #    ?g  | boolean | True if file1 has the \CF{setgid} bit   
  19.   #        |         | set (false under NT)   
  20.   #    ?G  | boolean | True if file1 exists and has a group   
  21.   #        |         | ownership equal to the caller's group   
  22.   #    ?k  | boolean | True if file1 exists and has the sticky bit set   
  23.   #    ?l  | boolean | True if file1 exists and is a symbolic link   
  24.   #    ?M  | Time    | Last modification time for file1   
  25.   #    ?o  | boolean | True if file1 exists and is owned by   
  26.   #        |         | the caller's effective uid   
  27.   #    ?O  | boolean | True if file1 exists and is owned by   
  28.   #        |         | the caller's real uid   
  29.   #    ?p  | boolean | True if file1 exists and is a fifo   
  30.   #    ?r  | boolean | True if file1 is readable by the effective   
  31.   #        |         | uid/gid of the caller   
  32.   #    ?R  | boolean | True if file is readable by the real   
  33.   #        |         | uid/gid of the caller   
  34.   #    ?s  | int/nil | If file1 has nonzero size, return the size,   
  35.   #        |         | otherwise return nil   
  36.   #    ?S  | boolean | True if file1 exists and is a socket   
  37.   #    ?u  | boolean | True if file1 has the setuid bit set   
  38.   #    ?w  | boolean | True if file1 exists and is writable by   
  39.   #        |         | the effective uid/gid   
  40.   #    ?W  | boolean | True if file1 exists and is writable by   
  41.   #        |         | the real uid/gid   
  42.   #    ?x  | boolean | True if file1 exists and is executable by   
  43.   #        |         | the effective uid/gid   
  44.   #    ?X  | boolean | True if file1 exists and is executable by   
  45.   #        |         | the real uid/gid   
  46.   #    ?z  | boolean | True if file1 exists and has a zero length   
  47.   #   
  48.   # Tests that take two files:   
  49.   #   
  50.   #    ?-  | boolean | True if file1 and file2 are identical   
  51.   #    ?=  | boolean | True if the modification times of file1   
  52.   #        |         | and file2 are equal   
  53.   #    ?<  | boolean | True if the modification time of file1   
  54.   #        |         | is prior to that of file2   
  55.   #    ?>  | boolean | True if the modification time of file1   
  56.   #        |         | is after that of file2   
  57.   #   
  58.   #   
  59.   def  test(int_cmd, file1, file2 )  
  60.     # This is just a stub for a builtin Ruby method.   
  61.     # See the top of this file for more info.   
  62.   end   
#     test(int_cmd, file1 [, file2] ) => obj
  #
  #
  # Uses the integer <i>aCmd</i> to perform various tests on
  # <i>file1</i> (first table below) or on <i>file1</i> and
  # <i>file2</i> (second table).
  #
  # File tests on a single file:
  #
  #   Test   Returns   Meaning
  #    ?A  | Time    | Last access time for file1
  #    ?b  | boolean | True if file1 is a block device
  #    ?c  | boolean | True if file1 is a character device
  #    ?C  | Time    | Last change time for file1
  #    ?d  | boolean | True if file1 exists and is a directory
  #    ?e  | boolean | True if file1 exists
  #    ?f  | boolean | True if file1 exists and is a regular file
  #    ?g  | boolean | True if file1 has the \CF{setgid} bit
  #        |         | set (false under NT)
  #    ?G  | boolean | True if file1 exists and has a group
  #        |         | ownership equal to the caller's group
  #    ?k  | boolean | True if file1 exists and has the sticky bit set
  #    ?l  | boolean | True if file1 exists and is a symbolic link
  #    ?M  | Time    | Last modification time for file1
  #    ?o  | boolean | True if file1 exists and is owned by
  #        |         | the caller's effective uid
  #    ?O  | boolean | True if file1 exists and is owned by
  #        |         | the caller's real uid
  #    ?p  | boolean | True if file1 exists and is a fifo
  #    ?r  | boolean | True if file1 is readable by the effective
  #        |         | uid/gid of the caller
  #    ?R  | boolean | True if file is readable by the real
  #        |         | uid/gid of the caller
  #    ?s  | int/nil | If file1 has nonzero size, return the size,
  #        |         | otherwise return nil
  #    ?S  | boolean | True if file1 exists and is a socket
  #    ?u  | boolean | True if file1 has the setuid bit set
  #    ?w  | boolean | True if file1 exists and is writable by
  #        |         | the effective uid/gid
  #    ?W  | boolean | True if file1 exists and is writable by
  #        |         | the real uid/gid
  #    ?x  | boolean | True if file1 exists and is executable by
  #        |         | the effective uid/gid
  #    ?X  | boolean | True if file1 exists and is executable by
  #        |         | the real uid/gid
  #    ?z  | boolean | True if file1 exists and has a zero length
  #
  # Tests that take two files:
  #
  #    ?-  | boolean | True if file1 and file2 are identical
  #    ?=  | boolean | True if the modification times of file1
  #        |         | and file2 are equal
  #    ?<  | boolean | True if the modification time of file1
  #        |         | is prior to that of file2
  #    ?>  | boolean | True if the modification time of file1
  #        |         | is after that of file2
  #
  #
  def test(int_cmd, file1, file2 )
    # This is just a stub for a builtin Ruby method.
    # See the top of this file for more info.
  end
Ruby代码
  1. irb(main):045:0> test( "A" "/var/log/mysql.log" )  
  2. => Fri Apr 02 10:22:46 +0800 2010  
  3. irb(main):046:0> test("C" "/var/log/mysql.log" )  
  4. => Fri Apr 02 10:22:46 +0800 2010  
  5. irb(main):047:0> test("c" "/var/log/mysql.log" )  
  6. => false   
  7. irb(main):048:0> test("e" "/var/log/mysql.log" )  
  8. => true   
irb(main):045:0> test("A", "/var/log/mysql.log")
=> Fri Apr 02 10:22:46 +0800 2010
irb(main):046:0> test("C", "/var/log/mysql.log")
=> Fri Apr 02 10:22:46 +0800 2010
irb(main):047:0> test("c", "/var/log/mysql.log")
=> false
irb(main):048:0> test("e", "/var/log/mysql.log")
=> true



这个可以用来调试。。很强大:

Ruby代码
  1. set_trace_func proc { |event, file, line, id, binding, classname|  
  2.   #        printf "%8s %s:%-2d %10s %8s\n", event, file, line, id, classname   
  3.   #     }   
set_trace_func proc { |event, file, line, id, binding, classname|
  #        printf "%8s %s:%-2d %10s %8s\n", event, file, line, id, classname
  #     }



rackuphttp://www.elanso.com/ArticleModule/sourcearticle.aspx?idx=L9IYPUNOVwLmP0KUG9SEKAIi

分享到:
评论

相关推荐

    autoload与namespace实例

    在PHP编程中,`autoload`和`namespace`是两个非常重要的概念,它们极大地提升了代码的组织性和可维护性。本文将深入探讨这两个概念,并通过实例来帮助你更好地理解和应用它们。 首先,我们来理解`autoload`。在PHP...

    autoload机制

    在PHP编程中,`autoload`机制是一个至关重要的特性,它允许开发者在程序运行时按需加载类文件,而不是在脚本开始时一次性包含所有类。这样显著减少了代码的执行时间和资源消耗,尤其对于大型项目来说,能有效提高...

    php __autoload自动加载功能详解

    这样,你无需在每个文件顶部都使用 `require_once` 或 `include_once` 引入类文件,只需在项目中设置一次`__autoload`,就可以确保在需要时正确加载类。 二、`__autoload` 函数定义与使用 要实现`__autoload`,你...

    PHP的autoload机制的实现解析

    在这个背景下,最著名且广泛使用的自动加载解决方案是Composer,它通过其自带的自动加载生成器,会根据项目中的依赖关系生成一个vendor/autoload.php文件。这个文件包含了所有需要的自动加载逻辑,并且支持PSR-0和...

    autoload.zip

    在IT行业中,自动加载(Autoload)是一种常见且重要的编程机制,特别是在游戏开发领域,如Godot引擎。Godot是一个开源的游戏开发框架,它提供了一种便捷的方式来进行资源管理和脚本执行,这就是所谓的"autoload"功能...

    autoload-css-js.zip_js中的autoLoad

    在IT行业中,自动加载(Autoload)是一种优化代码组织和执行效率的技术,它允许程序在需要时自动引入或加载所需的类、模块或者资源,而无需显式地预先包含它们。这里的"autoload-css-js.zip"是一个压缩包,其核心是...

    aota_autoload2mysql

    9. **版本控制**:压缩包中的"aota_autoload2mysql.git"表明这个项目使用了Git进行版本控制,这对于团队协作和代码历史追踪非常有用。 综上所述,"aota_autoload2mysql"项目涵盖了从Python读取文本数据、使用MySQL ...

    PHP中spl-autoload-register()函数用法实例详解-.docx

    PHP 中 spl_autoload_register() 函数用法实例详解 PHP 中的自动加载机制是指在实例化一个未定义的类时,系统自动加载该类的类文件。spl_autoload_register() 函数是 PHP 中的一个自动加载函数,用于注册自动加载...

    PHP中spl_autoload_register()和__autoload()区别分析

    4. 如果项目中已经实现了__autoload()函数,那么必须显式地使用spl_autoload_register('__autoload')将其加入自动加载栈中,因为spl_autoload_register()函数会将Zend Engine中的__autoload()函数取代为spl_autoload...

    PHP中spl-autoload-register()函数用法实例详解-.pdf

    在上面的例子中,我们使用了匿名函数作为 spl_autoload_register() 函数的参数,该函数用于加载类文件。 spl_autoload_register() 函数的返回值是布尔值,表示注册是否成功。如果注册成功,则返回 TRUE,否则返回 ...

    PHP中spl_autoload_register()函数用法实例详解_.docx

    本文将深入探讨`spl_autoload_register()`的用法及其在实际开发中的应用。 首先,我们来看一下`__autoload`函数。在PHP5中,当尝试实例化一个未定义的类时,系统会自动调用`__autoload`函数。这个函数接受一个参数...

    Ruby-将Ruby变成一个多功能命令行实用程序

    Ruby中的`ARGV`数组可以捕获命令行传递的参数,而`gets`方法则用于读取用户输入的控制台数据。 1. **基础架构**: 创建一个Ruby CLI工具时,首先定义一个主入口文件,例如`bin/main.rb`。在这个文件中,我们可以...

    VirtualTreeview AutoLoad 自动装载 数据库.rar

    在处理数据库中的大量数据时,自动装载(AutoLoad)策略可以显著提高应用程序的性能和用户体验。 VirtualTreeview的AutoLoad机制设计为按需加载数据,即只有当用户滚动到特定节点或其子节点时,才会从数据库中加载...

    php中spl_autoload详解

    在加载过程中,`spl_autoload` 首先会将 `$class_name` 转换为小写,然后在 `include_path` 中查找对应的文件。 为了使 `spl_autoload` 自动起作用,你需要使用 `spl_autoload_register` 函数。`spl_autoload_...

    spl_autoload_register与autoload的区别详解

    spl_autoload_register(PHP 5 &gt;= 5.1.2)spl_autoload_register — 注册__autoload()函数说明bool spl_autoload_register ([ ...因为spl_autoload_register()函数会将Zend Engine中的__autoload函数取代为spl_autoload

    PHP中spl_autoload_register函数的用法总结

    在实际应用中,spl_autoload_register通常与require_once()一起使用,这是为了确保类文件只被加载一次,避免重复包含导致的错误。 总结来说,spl_autoload_register函数通过提供一种灵活的方式来注册自定义的自动...

    php autoload 代码

    至于压缩包中的文件`AutoloadWk`,这可能是包含了一个名为`Autoload`的工作目录或脚本,它可能是用来演示如何实现上述自动加载功能的代码实例。在这个文件中,可能包含了如何设置自动加载规则,以及如何组织类文件...

    PHP函数spl_autoload_register()用法和__autoload()介绍

    这是因为在spl_autoload_register()函数内部,它会将Zend引擎中原有的__autoload()函数替换为spl_autoload()或spl_autoload_call()。 至于自动加载函数的编写,通常需要编写一个能够根据类名来定位并包含类文件的...

    autoloaded:消除为项目中的每个 Ruby 源代码文件手工编写 `autoload` 语句的苦差事

    它消除了为项目中的每个 Ruby 源代码文件手工编写autoload语句的苦差事。 它还避免了严格的约定驱动的设施(如 RubyGem提供的设施)的限制。 Autoloaded假定,但不强制,常量名和源文件之间的CamelCase -to- snake...

    php中autoload的用法总结

    PHP中的autoload机制是用于自动加载类文件,解决在使用类之前必须手动加载相应文件的问题。autoload能够根据类名自动推断文件路径并加载,极大方便了开发者管理项目文件。PHP的autoload机制分为几个主要部分,首先是...

Global site tag (gtag.js) - Google Analytics