- 浏览: 335176 次
- 性别:
- 来自: 北京
文章分类
最新评论
# # = ostruct.rb: OpenStruct implementation # # Author:: Yukihiro Matsumoto # Documentation:: Gavin Sinclair # # OpenStruct allows the creation of data objects with arbitrary attributes. # See OpenStruct for an example. # # # OpenStruct allows you to create data objects and set arbitrary attributes. # For example: # # require 'ostruct' # # record = OpenStruct.new # record.name = "John Smith" # record.age = 70 # record.pension = 300 # # puts record.name # -> "John Smith" # puts record.address # -> nil # # It is like a hash with a different way to access the data. In fact, it is # implemented with a hash, and you can initialize it with one. # # hash = { "country" => "Australia", :population => 20_000_000 } # data = OpenStruct.new(hash) # # p data # -> <OpenStruct country="Australia" population=20000000> # class OpenStruct # # Create a new OpenStruct object. The optional +hash+, if given, will # generate attributes and values. For example. # # require 'ostruct' # hash = { "country" => "Australia", :population => 20_000_000 } # data = OpenStruct.new(hash) # # p data # -> <OpenStruct country="Australia" population=20000000> # # By default, the resulting OpenStruct object will have no attributes. # def initialize(hash=nil) @table = {} if hash for k,v in hash @table[k.to_sym] = v new_ostruct_member(k) end end end # Duplicate an OpenStruct object members. def initialize_copy(orig) super @table = @table.dup end def marshal_dump @table end def marshal_load(x) @table = x @table.each_key{|key| new_ostruct_member(key)} end def new_ostruct_member(name) name = name.to_sym unless self.respond_to?(name) meta = class << self; self; end meta.send(:define_method, name) { @table[name] } meta.send(:define_method, :"#{name}=") { |x| @table[name] = x } end end def method_missing(mid, *args) # :nodoc: mname = mid.id2name len = args.length if mname =~ /=$/ if len != 1 raise ArgumentError, "wrong number of arguments (#{len} for 1)", caller(1) end if self.frozen? raise TypeError, "can't modify frozen #{self.class}", caller(1) end mname.chop! self.new_ostruct_member(mname) @table[mname.intern] = args[0] elsif len == 0 @table[mid] else raise NoMethodError, "undefined method `#{mname}' for #{self}", caller(1) end end # # Remove the named field from the object. # def delete_field(name) @table.delete name.to_sym end InspectKey = :__inspect_key__ # :nodoc: # # Returns a string containing a detailed summary of the keys and values. # def inspect str = "#<#{self.class}" Thread.current[InspectKey] ||= [] if Thread.current[InspectKey].include?(self) then str << " ..." else first = true for k,v in @table str << "," unless first first = false Thread.current[InspectKey] << v begin str << " #{k}=#{v.inspect}" ensure Thread.current[InspectKey].pop end end end str << ">" end alias :to_s :inspect attr_reader :table # :nodoc: protected :table # # Compare this object and +other+ for equality. # def ==(other) return false unless(other.kind_of?(OpenStruct)) return @table == other.table end end
断网了闲着无聊看代码...
几点疑问:
1.这个initialize_copy怎么就成了私有方法了?
def initialize_copy(orig) super @table = @table.dup end
2.貌似在不用send的情况下,即使传入多个参数(多个参数被转换成array了)args.length也是1
len = args.length if mname =~ /=$/ if len != 1 #......
发表评论
-
新博客
2012-04-23 20:47 1734https://db-china.org -
Ruby Verbose Warning Mode
2011-10-16 14:48 2051Ruby在很多方面是一个更优雅的Perl,从Perl社区继承了 ... -
Pattern Match In Ruby
2011-10-07 01:17 2006最近看了一些Erlang,模式匹配是个好东西,简单的sum函数 ... -
Draper: View Models for Rails
2011-10-07 01:19 2268Draper是一个Ruby gem,它让Rails model ... -
Active Record batch processing in parallel processes
2011-10-07 01:20 2270Active Record 提供 find_each来分批处理 ... -
最轻量级的Ruby后台任务
2011-08-04 16:47 3860普通情况下ruby调用系统命令行的过程是堵塞的,无论是用sys ... -
test
2011-07-15 19:59 0test -
fiber
2011-06-17 09:37 0挖坑,待填。。 1.用到fiber.alive?、fiber ... -
Identity Map in Rails3.1
2011-06-12 18:29 2737Identity Map是Rails3.1的又 ... -
xx00
2011-06-06 03:40 0https://github.com/ngmoco/cache ... -
挖坑1
2011-06-06 02:17 0cache money 源码 替换memcache为redis ... -
websocket demo
2011-06-04 20:44 2054地址:https://github.com/hooopo/we ... -
ruby GC
2011-06-02 04:24 0http://blog.csdn.net/lijun84/a ... -
reduce method missing call stack with dynamic define method
2011-04-22 22:54 1592method_missing是ruby里面一个非常cool的h ... -
Autocompete with Trie
2011-04-09 04:04 1674像微薄里面用户输入一 ... -
用imagemagick和tesseract-ocr破解简单验证码
2011-04-09 01:31 18926工具:imagemagick + tesseract-ocr ... -
OAuth gem for rails,支持豆瓣,新浪微薄,腾讯微博,搜狐微博,网易微博
2011-03-26 03:13 4480地址:https://github.com/hooopo/oa ... -
用jmeter模拟amf请求进行压力测试
2010-12-16 16:56 30221.获取amf二进制包: 在本地建立proxy,端口为888 ... -
Memoization in Ruby
2010-11-14 11:42 1210这里的Memoization就是将ruby的方法或lambda ... -
整理了一下2008-2010的RubyHeroes博客列表
2010-10-07 02:26 2827Bryan Helmkamp(webrat作者)https:/ ...
相关推荐
OpenStruct子类,该子类将嵌套的哈希属性作为RecursiveOpenStructs返回。 用法 它允许在一系列方法中调用哈希中的哈希: ros = RecursiveOpenStruct . new ( { wha : { tagoo : 'siam' } } ) ros . wha . tagoo # =...
使用OpenStruct为电影数据库API提供简单直观的界面。 获取您的API密钥。 入门 在Rails应用内安装 将此行添加到您的应用程序的Gemfile中: gem 'themoviedb-api' 安装外部Rails应用 gem install themoviedb - ...
**Struct** 和 **OpenStruct** 都是用来创建简单的数据容器的类,但它们之间存在一些显著的区别: - **Struct** 在定义时需要明确声明所有字段,而 **OpenStruct** 可以动态添加属性。 - 性能方面,**Struct** 优于...
FastOpenStruct是Ruby OpenStruct的重新实现,可以避免在每次实例化时使MRI的方法缓存无效。 应该可以替代OpenStruct。 表现 当您的OpenStructs倾向于具有静态属性集时,FastOpenStruct会非常快: λ ruby -I./...
安装将此行添加到应用程序的 Gemfile 中: gem 'blockhead'然后执行: $ bundle或者自己安装: $ gem install blockhead用法假设您有以下对象,其中包含一些 1:1 和 1:M 的关系属性集: object = OpenStruct ....
烂番茄 烂番茄是一个ActiveRecord风格的API包装 。 rottentomatoes 旨在使常见任务比直接处理基于 URL 的 API 更容易。...# => <OpenStruct> @movie = RottenMovie . find ( :imdb => 137523 ) # => <OpenStruct> @m
请注意,这回购已被弃用 RubyTMDB ruby-tmdb 是的 ActiveRecord 风格的 API 包装器。... find ( :title => "Iron Man" , :limit => 1 )# => <OpenStruct>@movie . name# => "Iron Man"@movie . posters . length
除了使用Hash或OpenStruct ,您还可以使用ImmutableStruct使您的类型更加清晰,这几乎同样方便。 安装 添加到您的Gemfile : gem 'immutable-struct' 然后安装: bundle install 如果不使用 bundler,只需使用 ...
超级串行 安装 将此行添加到您的应用程序的Gemfile中: gem 'super_serial' ... 在后台,它在SuperHero的功能列中序列化了一个OpenStruct。 然后,它为每个键值对或“输入”定义访问器方法。 superman = Supe
- OpenFastStruct 是一种数据结构,类似于 OpenStruct 但速度快 网络框架 - 罗达 http://lotusrb.org/ - 莲花 哈希构建器/序列化器 https://github.com/mindreframer/api_view - 该死的快速序列化器 gem 简单的...
这个 gem 将 Limdesk API 包装到 OpenStruct (RecursiveOpenStruct) 对象中。 有关 API 的更多信息,请查看。 当前 API 涵盖了基本的、最常见的操作。 更高级的版本目前正在开发中。 连接到 API LimdeskApi . ...
日志解析器 解析给定日志文件的日志并返回页面浏览量。 如何使用。 运行Ruby脚本 ... 最初的实现是将每个IP地址和页面存储在OpenStruct中。 但随后将重复IP地址和页面。 这对于测试以及内存都不理想。 因
在Ruby中,可以使用OpenStruct或Delegator实现: ```ruby require 'forwardable' class RealObject def some_method "Real object's method" end end class Proxy extend Forwardable def_delegators :@real...
Based: Capybara; Nokogiri; RSpec; Selenium; Mechanize;Written on pure Ruby, using: Threads/Queue/Mutex/OpenStruct/StoreCheck: bin/start Test bundle exec rspec
对Struct简单扩展,使其与Hash更兼容,而没有OpenStruct的性能损失 安装 将此行添加到应用程序的 Gemfile 中: gem 'super_struct' 然后执行: $ bundle 或者自己安装: $ gem install super_struct 用法 ...