[#44861] Ruby 1.9のARGVのエンコーディング — rubikitch@...

るびきちです。

17 messages 2008/04/26
[#44862] Re: Ruby 1.9のARGVのエンコーディング — Yukihiro Matsumoto <matz@...> 2008/04/26

まつもと ゆきひろです

[#44863] Re: Ruby 1.9のARGVのエンコーディング — "NARUSE, Yui" <naruse@...> 2008/04/26

成瀬です、パッチ用意してから投げようと思ったら出遅れた、

[#44864] Re: Ruby 1.9のARGVのエンコーディング — Yukihiro Matsumoto <matz@...> 2008/04/26

まつもと ゆきひろです

[#44865] Re: Ruby 1.9のARGVのエンコーディング — "U.Nakamura" <usa@...> 2008/04/28

こんにちは、なかむら(う)です。

[#44866] Re: Ruby 1.9のARGVのエンコーディング — "NARUSE, Yui" <naruse@...> 2008/04/28

成瀬です。

[#44868] Re: Ruby 1.9のARGVのエンコーディング — "U.Nakamura" <usa@...> 2008/04/30

こんにちは、なかむら(う)です。

[ruby-list:44859] Re: Method#arity

From: rubikitch@...
Date: 2008-04-25 09:53:50 UTC
List: ruby-list #44859
From: "ARAI Shunichi" <arai@mellowtone.org>
Subject: [ruby-list:44858] Method#arity
Date: Fri, 25 Apr 2008 16:31:01 +0900

るびきちです。

> メソッドの引数の数を知りたいのですが、
> Method#arity以外に手段はありますか?
> 
> *必須引数の数、
> *デフォルト値付き引数の数、
> *可変個引数があるかどうか、
> をそれぞれ知りたいのですが。

set_trace_funcを使う必要があるのでかなり複雑です。
rcodetoolsに含まれている rct-meth-args コマンドがメソッドの引数を表示してくれます。
$ sudo gem install rcodetools

たとえばこんなスクリプトを rct-meth-args にかけると、

# method_args_data.rb
class FixedArgsMethods
  def self.singleton(a1) end
  def initialize(arg) end
  def f(a1) end
  def b(a1,&block) end
  define_method(:defmethod) {|a1|}
  attr_accessor :by_attr_accessor
  attr :by_attr_false
  attr :by_attr_true, true
  attr_reader :by_attr_reader_1, :by_attr_reader_2
  attr_writer :by_attr_writer
  def private_meth(x) end
  private :private_meth
  class << self
    attr_accessor :singleton_attr_accessor
    define_method(:singleton_defmethod){|a2|}
  end
end

module VariableArgsMethods
  def s(a1,*splat) end
  def sb(a1,*splat, &block) end
  def d(a1,default=nil) end
  def ds(a1,default=nil,*splat) end
  def dsb(a1,default=nil,*splat,&block) end
  def db(a1,default=nil,&block) end
end

class Fixnum
  def method_in_Fixnum(arg1, arg2) end
  def self.singleton_method_in_Fixnum(arg1, arg2) end
end
class Bignum
  def method_in_Bignum(arg1, arg2) end
end
class Float
  def method_in_Float(arg1, arg2) end
end
class Symbol
  def method_in_Symbol(arg1, arg2) end
end
class Binding
  def method_in_Binding(arg1, arg2) end
end
class UnboundMethod
  def method_in_UnboundMethod(arg1, arg2) end
end
class Method
  def method_in_Method(arg1, arg2) end
end
class Proc
  def method_in_Proc(arg1, arg2) end
end
class Continuation
  def method_in_Continuation(arg1, arg2) end
end
class Thread
  def method_in_Thread(arg1, arg2) end
end
# FIXME mysterious
# class FalseClass
#   def method_in_FalseClass(arg1, arg2) end
# end
class TrueClass
  def method_in_TrueClass(arg1, arg2) end
end
class NilClass
  def method_in_NilClass(arg1, arg2) end
end
class Struct
  def method_in_Struct(arg1, arg2) end
end

require 'digest'
class Digest::Base
  def method_in_Digest_Base(arg1, arg2) end
end

class AnAbstractClass
  $__method_args_off = true
  def self.allocate
    raise NotImplementedError, "#{self} is an abstract class."
  end
  $__method_args_off = false

  def method_in_AnAbstractClass(arg1, arg2)
  end

end

class AClass
  include VariableArgsMethods
  extend VariableArgsMethods
end

class ASubClass < AClass
end

StructA = Struct.new :a, :b
class SubclassOfStructA < StructA
  attr :method_in_b
end
class StructSubclass < Struct.new(:c)
  attr :method_in_c
end


こうなります。


$ rct-meth-args method_args_data.rb
FixedArgsMethods.singleton (a1)
FixedArgsMethods#initialize (arg)
FixedArgsMethods#f (a1)
FixedArgsMethods#b (a1, &block)
FixedArgsMethods#defmethod (...)
FixedArgsMethods#by_attr_accessor
FixedArgsMethods#by_attr_accessor= (value)
FixedArgsMethods#by_attr_false
FixedArgsMethods#by_attr_true
FixedArgsMethods#by_attr_true= (value)
FixedArgsMethods#by_attr_reader_1
FixedArgsMethods#by_attr_reader_2
FixedArgsMethods#by_attr_writer= (value)
FixedArgsMethods#private_meth (x)
FixedArgsMethods.singleton_attr_accessor
FixedArgsMethods.singleton_attr_accessor= (value)
FixedArgsMethods.singleton_defmethod (...)
VariableArgsMethods#s (a1, *splat)
VariableArgsMethods#sb (a1, *splat, &block)
VariableArgsMethods#d (a1, default = nil)
VariableArgsMethods#ds (a1, default = nil, *splat)
VariableArgsMethods#dsb (a1, default = nil, *splat, &block)
VariableArgsMethods#db (a1, default = nil, &block)
Fixnum#method_in_Fixnum (arg1, arg2)
Fixnum.singleton_method_in_Fixnum (arg1, arg2)
Bignum#method_in_Bignum (arg1, arg2)
Float#method_in_Float (arg1, arg2)
Symbol#method_in_Symbol (arg1, arg2)
Binding#method_in_Binding (arg1, arg2)
UnboundMethod#method_in_UnboundMethod (arg1, arg2)
Method#method_in_Method (arg1, arg2)
Proc#method_in_Proc (arg1, arg2)
Continuation#method_in_Continuation (arg1, arg2)
Thread#method_in_Thread (arg1, arg2)
TrueClass#method_in_TrueClass (arg1, arg2)
NilClass#method_in_NilClass (arg1, arg2)
Struct#method_in_Struct (arg1, arg2)
Digest::Instance#update (...)
Digest::Instance#<< (...)
Digest::Instance#reset (...)
Digest::Instance#digest_length (...)
Digest::Instance#block_length (...)
Digest::Instance#== (...)
Digest::Instance#inspect (...)
Digest::Instance#new (...)
Digest::Instance#digest (...)
Digest::Instance#digest! (...)
Digest::Instance#hexdigest (...)
Digest::Instance#hexdigest! (...)
Digest::Instance#to_s (...)
Digest::Instance#length (...)
Digest::Instance#size (...)
Digest::Class.digest (...)
Digest::Class.hexdigest (...)
Digest::Base#reset (...)
Digest::Base#update (...)
Digest::Base#<< (...)
Digest::Base#finish (...)
Digest::Base#digest_length (...)
Digest::Base#block_length (...)
Digest::Class.file (name)
Digest::Instance#file (name)
Digest::Base#method_in_Digest_Base (...)
AnAbstractClass#method_in_AnAbstractClass (...)
include AClass <= VariableArgsMethods
extend AClass <- VariableArgsMethods
class ASubClass < AClass
class <Struct: a,b> < Struct
class SubclassOfStructA < StructA
SubclassOfStructA#method_in_b
class <Struct: c> < Struct
class StructSubclass < <Struct: c>
StructSubclass#method_in_c


参考になれば幸いです。

--
rubikitch
Blog: http://d.hatena.ne.jp/rubikitch/
Site: http://www.rubyist.net/~rubikitch/

In This Thread