`

ostruct.rb caller

阅读更多
#
# = 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
分享到:
评论

相关推荐

    SmartThreadPool

    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

    标题中的"Caller-Id-DTMF.rar_caller id_full"提到了电话的呼叫者ID(Caller ID)和双音多频(DTMF)技术。这是一个关于这两种通信技术的详细资料包。呼叫者ID允许接收方在电话响起时知道来电者的身份,而DTMF则是...

    app_DTMF_decoder.rar_caller id_来电显示

    标题中的"app_DTMF_decoder.rar_caller id_来电显示"揭示了这个压缩包文件包含一个应用程序,专门用于DTMF(双音多频)解码,并且与来电显示功能相关,特别是针对caller id的处理。DTMF是一种在电话通信中广泛使用的...

    DTMF_CallerID.rar_DTMF C.id_dtmf caller

    标题中的"DTMF_CallerID.rar_DTMF C.id_dtmf caller"表明这是一个与DTMF(双音多频)技术以及来电显示相关的压缩文件,主要用于解析和展示主叫方的电话号码。DTMF是一种广泛使用的电话信号传输方式,允许用户通过...

    CI.zip_8051 caller id_8051 pcb_The Chip_caller id_caller id 8051

    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

    标题中的"Devel-Caller-Perl-1.4.tar.gz"是一个Perl编程语言的扩展模块,主要用于调试和分析代码执行。在Linux环境下,Perl是一种强大的脚本语言,广泛用于系统管理、网络编程以及各种自动化任务。这个模块是Devel::...

    手机ud-caller

    "手机ud-caller"是一款专为黑莓8900设计的应用程序,旨在提供便捷的通话功能和服务。ud-caller数据库的最新版本确保了用户在安装后无需再进行繁琐的数据库更新,从而节省时间和精力,提高了用户体验。这个应用可能...

    PyPI 官网下载 | pthr_db_caller-0.0.11.tar.gz

    《PyPI官网下载:深入解析.pthr_db_caller-0.0.11.tar.gz》 在Python的世界中,PyPI(Python Package Index)是最重要的软件仓库,它为开发者提供了无数的开源库和模块,方便他们构建自己的项目。本文将详细解析...

    js的隐含参数(arguments,callee,caller)使用方法

    在JavaScript编程中,arguments、caller和callee是函数对象自带的三个隐含参数,它们为开发者提供了额外的函数执行信息,尤其在处理函数参数、递归调用以及调用栈追踪时非常有用。下面详细介绍这些隐含参数的使用...

    caller和callee的区别介绍及演示结果

    caller caller返回一个函数的引用,这个函数调用了当前的函数。 使用这个属性要注意: 1 这个属性只有当函数在执行时才有用2 如果在javascript程序中,函数是由顶层调用的,则返回nullfunctionName.caller: ...

    abc.rar_ABC_caller id_cndmain.ocx_ocx控件_来电显示

    标题中的"abc.rar_ABC_caller id_cndmain.ocx_ocx控件_来电显示"揭示了这个压缩包的内容,主要是一个名为"abc"的软件或工具,它包含了一个用于来电显示功能的OCX(ActiveX Control)控件,具体为"cndmain.ocx"。...

    srt协议的caller模式的c语言源码

    在SRT协议中,caller模式通常指的是客户端模式,即主动发起连接到SRT服务器的一方。 本资源包含的是SRT协议caller模式的C语言源码,这对于想要开发SRT应用的软件工程师来说是非常有价值的参考资料。源码实现了...

    js中arguments,caller,callee,apply的用法小结.docx

    var a = callerDemo.caller.toString(); alert(a); } else { alert("this is a top function"); } } function handleCaller() { callerDemo(); } ``` 在上面的例子中,handleCaller调用callerDemo,...

    Javascript 实用小技巧

    Function.prototype.apply = function (obj, argu) { if (obj) obj.constructor.prototype._caller = this; var argus = new Array(); for (var i=0;i&lt;argu.length;i++) argus[i] = “argu[”...

    javascript中arguments,callee,caller详解

    JavaScript中的arguments、caller和callee是与函数调用相关的几个重要概念,它们分别代表函数调用时传递的参数对象、调用当前函数的函数以及当前正在执行的函数。 首先,我们来了解arguments。在JavaScript中,当...

    matlab开发-caller2base

    "caller2base"是一个专门针对MATLAB的开发工具,它的主要功能是将变量从函数工作区复制到基工作区。这一功能在处理大型项目或者需要在不同函数之间共享数据时尤其有用。下面我们将详细探讨这个工具的工作原理、应用...

    Javascript - 全面理解 caller,callee,call,apply (转载)

    这篇文章将深入探讨四个关键概念:caller、callee、call和apply,它们都是JavaScript函数操作的核心部分,对于理解和使用高级JavaScript编程至关重要。 首先,我们来了解`caller`和`callee`。在JavaScript的函数...

    javascript中caller和callee详解

    最近学习javascript,碰到caller和callee的问题,去网上百度了很多。搜到的内容大同小益,整理总结了一下与大家分享。 caller:返回一个对调用... caller.caller()//返回调用caller函数的函数引用 } function handle

    activerecord-commentator:将caller_location(文件名,行号和方法名)添加为SQL注释

    ActiveRecord :: Commentator将caller_location (文件名,行号和方法名)添加为调用SQL语句SQL注释。 安装 将此行添加到您的应用程序的Gemfile中: gem 'activerecord-commentator' 然后执行: $ bundle 或将...

    js的隐含参数(arguments,callee,caller)使用方法.docx

    JavaScript中的隐含参数`arguments`, `callee`, 和 `caller`是函数内部的特殊变量,它们提供了关于函数调用的重要信息。下面将详细解释这三个参数的使用方法。 **arguments对象** `arguments`对象是一个非常有用的...

Global site tag (gtag.js) - Google Analytics