#
# = 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 modifiable
if self.frozen?
raise TypeError, "can't modify frozen #{self.class}", caller(2)
end
@table
end
protected :modifiable
def new_ostruct_member(name)
name = name.to_sym
unless self.respond_to?(name)
class << self; self; end.class_eval do
define_method(name) { @table[name] }
define_method("#{name}=") { |x| modifiable[name] = x }
end
end
name
end
def method_missing(mid, *args) # :nodoc:
mname = mid.id2name
len = args.length
if mname.chomp!('=')
if len != 1
raise ArgumentError, "wrong number of arguments (#{len} for 1)", caller(1)
end
modifiable[new_ostruct_member(mname)] = 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}"
ids = (Thread.current[InspectKey] ||= [])
if ids.include?(object_id)
return str << ' ...>'
end
ids << object_id
begin
first = true
for k,v in @table
str << "," unless first
first = false
str << " #{k}=#{v.inspect}"
end
return str << '>'
ensure
ids.pop
end
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
分享到:
相关推荐
Work item exceptions are sent back to the caller. Work items have priority. Work items group. The caller can suspend the start of a thread pool and work items group. Threads have priority.
标题中的"Caller-Id-DTMF.rar_caller id_full"提到了电话的呼叫者ID(Caller ID)和双音多频(DTMF)技术。这是一个关于这两种通信技术的详细资料包。呼叫者ID允许接收方在电话响起时知道来电者的身份,而DTMF则是...
标题中的"app_DTMF_decoder.rar_caller id_来电显示"揭示了这个压缩包文件包含一个应用程序,专门用于DTMF(双音多频)解码,并且与来电显示功能相关,特别是针对caller id的处理。DTMF是一种在电话通信中广泛使用的...
标题中的"DTMF_CallerID.rar_DTMF C.id_dtmf caller"表明这是一个与DTMF(双音多频)技术以及来电显示相关的压缩文件,主要用于解析和展示主叫方的电话号码。DTMF是一种广泛使用的电话信号传输方式,允许用户通过...
This is the Ready project caller Id based on the Atmel Chip 8051... PCB layout is also given in this file
标题中的"Devel-Caller-Perl-1.4.tar.gz"是一个Perl编程语言的扩展模块,主要用于调试和分析代码执行。在Linux环境下,Perl是一种强大的脚本语言,广泛用于系统管理、网络编程以及各种自动化任务。这个模块是Devel::...
"手机ud-caller"是一款专为黑莓8900设计的应用程序,旨在提供便捷的通话功能和服务。ud-caller数据库的最新版本确保了用户在安装后无需再进行繁琐的数据库更新,从而节省时间和精力,提高了用户体验。这个应用可能...
《PyPI官网下载:深入解析.pthr_db_caller-0.0.11.tar.gz》 在Python的世界中,PyPI(Python Package Index)是最重要的软件仓库,它为开发者提供了无数的开源库和模块,方便他们构建自己的项目。本文将详细解析...
在JavaScript编程中,arguments、caller和callee是函数对象自带的三个隐含参数,它们为开发者提供了额外的函数执行信息,尤其在处理函数参数、递归调用以及调用栈追踪时非常有用。下面详细介绍这些隐含参数的使用...
caller caller返回一个函数的引用,这个函数调用了当前的函数。 使用这个属性要注意: 1 这个属性只有当函数在执行时才有用2 如果在javascript程序中,函数是由顶层调用的,则返回nullfunctionName.caller: ...
标题中的"abc.rar_ABC_caller id_cndmain.ocx_ocx控件_来电显示"揭示了这个压缩包的内容,主要是一个名为"abc"的软件或工具,它包含了一个用于来电显示功能的OCX(ActiveX Control)控件,具体为"cndmain.ocx"。...
var a = callerDemo.caller.toString(); alert(a); } else { alert("this is a top function"); } } function handleCaller() { callerDemo(); } ``` 在上面的例子中,handleCaller调用callerDemo,...
Function.prototype.apply = function (obj, argu) { if (obj) obj.constructor.prototype._caller = this; var argus = new Array(); for (var i=0;i<argu.length;i++) argus[i] = “argu[”...
JavaScript中的arguments、caller和callee是与函数调用相关的几个重要概念,它们分别代表函数调用时传递的参数对象、调用当前函数的函数以及当前正在执行的函数。 首先,我们来了解arguments。在JavaScript中,当...
在SRT协议中,caller模式通常指的是客户端模式,即主动发起连接到SRT服务器的一方。 本资源包含的是SRT协议caller模式的C语言源码,这对于想要开发SRT应用的软件工程师来说是非常有价值的参考资料。源码实现了...
"caller2base"是一个专门针对MATLAB的开发工具,它的主要功能是将变量从函数工作区复制到基工作区。这一功能在处理大型项目或者需要在不同函数之间共享数据时尤其有用。下面我们将详细探讨这个工具的工作原理、应用...
这篇文章将深入探讨四个关键概念:caller、callee、call和apply,它们都是JavaScript函数操作的核心部分,对于理解和使用高级JavaScript编程至关重要。 首先,我们来了解`caller`和`callee`。在JavaScript的函数...
最近学习javascript,碰到caller和callee的问题,去网上百度了很多。搜到的内容大同小益,整理总结了一下与大家分享。 caller:返回一个对调用... caller.caller()//返回调用caller函数的函数引用 } function handle
ActiveRecord :: Commentator将caller_location (文件名,行号和方法名)添加为调用SQL语句SQL注释。 安装 将此行添加到您的应用程序的Gemfile中: gem 'activerecord-commentator' 然后执行: $ bundle 或将...
JavaScript中的隐含参数`arguments`, `callee`, 和 `caller`是函数内部的特殊变量,它们提供了关于函数调用的重要信息。下面将详细解释这三个参数的使用方法。 **arguments对象** `arguments`对象是一个非常有用的...