Rubyの隠し機能


160

「...の非表示機能」ミームを続けて、Rubyプログラミング言語のあまり知られていないが便利な機能を共有しましょう。

Ruby on Railsを使わずに、コアRubyでこの議論を制限するようにしてください。

以下も参照してください。

(回答ごとに1 つの非表示機能のみを入力してください。)

ありがとうございました


コミュニティウィキである必要があります
SilentGhost

回答:


80

Ruby 1.9からProc#===はProc#callのエイリアスです。つまり、Procオブジェクトは次のようなcaseステートメントで使用できます。

def multiple_of(factor)
  Proc.new{|product| product.modulo(factor).zero?}
end

case number
  when multiple_of(3)
    puts "Multiple of 3"
  when multiple_of(7)
    puts "Multiple of 7"
end

1
実際にこれを行うためにある時点で宝石を作成しましたが、私のコードは(a)混乱し、(b)遅くなりました。機能がコアになったことをとても嬉しく思います。
James A. Rosen、

76

Peter CooperがRubyトリックの優れたリストを持っています。おそらく私のお気に入りは、単一のアイテムとコレクションの両方を列挙できることです。(つまり、非コレクションオブジェクトを、そのオブジェクトのみを含むコレクションとして扱います。)次のようになります。

[*items].each do |item|
  # ...
end

38
これのより明示的な(したがって、よりよい)の形は、Array(項目).eachある
mislav

items文字列の場合は、[*…]で囲む必要はありません。String.eachは、一部のユーザーが期待するように文字を反復しません。自分自身をブロックに戻すだけです。
mxcl 2010

これはどのような用途に役立ちますか?ちょっと興味があるんだけど。
Ed S.

1
@Ed:メソッドを作成していて、メソッドのユーザーが可変引数リストまたは配列のいずれかを渡せるようにしたい場合に便利です。
James A.Rosen

64

これがどのように隠されているかはわかりませんが、1次元配列からハッシュを作成する必要があるときに便利です。

fruit = ["apple","red","banana","yellow"]
=> ["apple", "red", "banana", "yellow"]

Hash[*fruit]    
=> {"apple"=>"red", "banana"=>"yellow"}

Hash[ [["apple","red"], ["banana","yellow"] ]同じ結果が生成されることに注意してください。
マルク=アンドレ・Lafortune

54

私が好きなトリックの1つは*、配列以外のオブジェクトでsplat()エキスパンダーを使用することです。正規表現の一致の例を次に示します。

match, text, number = *"Something 981".match(/([A-z]*) ([0-9]*)/)

その他の例は次のとおりです。

a, b, c = *('A'..'Z')

Job = Struct.new(:name, :occupation)
tom = Job.new("Tom", "Developer")
name, occupation = *tom

13
ちなみに、これは好奇心が強い人のために、スプラットのターゲットでto_aを暗黙的に呼び出すことで機能します。
ボブ・アマン

1
あなたは試合に興味を持っていないなら、あなたは持つことができますtext, number = *"text 555".match(/regexp/)[1..-1]
Andrew Grimm

text, number = "Something 981".scan(/([A-z]*) ([0-9]*)/).flatten.map{|m| Integer(m) rescue m}
JonasElfström10年

7
両方とも良いトリックですが、それがあまりにも多くの魔法であるポイントがあるはずですよね?!
tomafro

1
@Andrew、あなたは考えましたか、その試合はnilを返すことができますか?nilにはメソッドがありません[]
Alexey

52

うわー、誰もフリップフロップ演算子について言及していません:

1.upto(100) do |i|
  puts i if (i == 3)..(i == 15)
end

11
そうだね…誰かがこれを私に説明しなければならないだろう。動作しますが、理由がわかりません。
Bob Aman

12
フリップフロップオペレーターは、ステートフルの場合です。その状態はすぐにtrueにi == 3切り替わり、との i != 3でfalse 切り替わりますi == 15。フリップフロップに似ています:en.wikipedia.org/wiki/Flip-flop_%28electronics%29
Konstantin Haase

1
私はこれを隠し機能と正確に呼んでいるわけではありません。数年前、Freenodeの#Rubyで初めて紹介されたのを覚えています。基本的に、Rubyのすべての機能を、これ以外の時点で使用してきました。
ELLIOTTCABLE

1
私はそれを迷惑とは呼ばないでしょう、それはあなたが使ったことのないものです。私はそれを使用し、特にいくつかの基準に基づいてファイルから行のブロックを取得しているときに、コードをうまく削減できます。
Tin Man

49

Rubyの優れた点の1つは、メソッドやクラスの定義など、他の言語が不快になる場所でメソッドを呼び出してコードを実行できることです。

たとえば、実行時まで不明なスーパークラスを持つ、つまりランダムなクラスを作成するには、次のようにします。

class RandomSubclass < [Array, Hash, String, Fixnum, Float, TrueClass].sample

end

RandomSubclass.superclass # could output one of 6 different classes.

これは1.9 Array#sampleメソッドを使用し(1.8.7のみで、を参照Array#choice)、この例はかなり不自然ですが、ここでそのパワーを確認できます。

もう1つのすばらしい例は、(他の言語がしばしば要求するように)固定されていないデフォルトのパラメーター値を配置する機能です。

def do_something_at(something, at = Time.now)
   # ...
end

もちろん、最初の例の問題は、呼び出し時ではなく定義時に評価されることです。したがって、スーパークラスが選択されると、プログラムの残りの部分はそのスーパークラスのままになります。

ただし、2番目の例では、を呼び出すたびdo_something_atに、at変数はメソッドが呼び出された時刻になります(まあ、それに非常に近い)


2
注:アレイ#1ランドは、あなたが簡単になどとしてレールの外側を使用することができたactivesupportのによって提供されるrequire 'activesupport'
rfunduk

Array#choiceは1.8.7にあります
Josh Lee

24
Array#choiceは1.8.7 のみです!使用しないでください。1.9で削除され、1.8.8で削除されます。#sampleを使用–Marc
AndréLafortune 2009

python:class DictList([dict、list] [random.randint(0,1)]):pass
Anurag Uniyal

def do_something_at(something、at = lambda {Time.now})at.call #now動的に時間を割り当てる
Jack Kinsella

47

別の小さな機能- Fixnumを36までの任意のベースに変換します。

>> 1234567890.to_s(2)
=> "1001001100101100000001011010010"

>> 1234567890.to_s(8)
=> "11145401322"

>> 1234567890.to_s(16)
=> "499602d2"

>> 1234567890.to_s(24)
=> "6b1230i"

>> 1234567890.to_s(36)
=> "kf12oi"

Huw Waltersがコメントしたように、他の方法への変換も同じくらい簡単です:

>> "kf12oi".to_i(36)
=> 1234567890

1
完全String#to_s(base)を期すために、整数に戻すために使用できます。"1001001100101100000001011010010".to_i(2)"499602d2".to_i(16)などはすべてオリジナルを返しますFixnum
Huw Walters

40

デフォルト値のハッシュ!この場合の配列。

parties = Hash.new {|hash, key| hash[key] = [] }
parties["Summer party"]
# => []

parties["Summer party"] << "Joe"
parties["Other party"] << "Jane"

メタプログラミングに非常に役立ちます。


1
本当だとも。Rubyハッシュは、 '='で割り当てられたデフォルト値がすでにある場合(それが空の割り当てであっても構いません)、 '<<'演算子を受け入れることができます。そうでない場合、ハッシュは '<<'を受け入れません。CMIIW
mhd

39

Ruby 1.9ソースをダウンロードして発行するとmake golf、次のようになります。

make golf

./goruby -e 'h'
# => Hello, world!

./goruby -e 'p St'
# => StandardError

./goruby -e 'p 1.tf'
# => 1.0

./goruby19 -e 'p Fil.exp(".")'
"/home/manveru/pkgbuilds/ruby-svn/src/trunk"

golf_prelude.c隠れているもっときちんとしたことについては、


38

1.9 Proc機能のもう1つの楽しい追加は、Proc#curryです。これにより、n個の引数を受け入れるProcを、n-1を受け入れるものに変換できます。ここで、上記のProc#===ヒントと組み合わせます。

it_is_day_of_week = lambda{ |day_of_week, date| date.wday == day_of_week }
it_is_saturday = it_is_day_of_week.curry[6]
it_is_sunday = it_is_day_of_week.curry[0]

case Time.now
when it_is_saturday
  puts "Saturday!"
when it_is_sunday
  puts "Sunday!"
else
  puts "Not the weekend"
end

35

非ブール値に対するブール演算子。

&& そして ||

どちらも最後に評価された式の値を返します。

それが理由です ||=、変数が未定義の場合に、右側の戻り値の式で変数を更新するです。これは明示的に文書化されていませんが、一般的な知識です。

しかし、それ&&=はそれほど広く知られていません。

string &&= string + "suffix"

に相当

if string
  string = string + "suffix"
end

これは、変数が未定義の場合に続行すべきでない破壊的な操作に非常に便利です。


2
より正確にstring &&= string + "suffix" は、 と同等 string = string && string + "suffix"です。こと&&とは||、その第2引数はつるはしで議論されたpを返します。154(パートI-Rubyのファセット、式、条件付き実行)。
Richard Michael

29

Railsが提供するSymbol#to_proc関数は本当にクールです。

の代わりに

Employee.collect { |emp| emp.name }

あなたは書ける:

Employee.collect(&:name)

これは明らかに、ブロックを使用するよりも「桁違いに遅い」のです。igvita.com/2008/07/08/6-optimization-tips-for-ruby-mri
Charles Roper

試してみたところ、両者に大きな違いはありませんでした。この「桁違い」のものはどこから来たのかわかりません。(Ruby 1.8.7を使用)
Matt Grande

1
Railsの外でこれを行うことも便利であり、require 'activesupport'実際にこれらのヘルパーのほとんどがそこから来ているので、それを使って行うことができます。
rfunduk 2009年

8
これは、active_supportの実装が原因で遅くなりました。つまり、複数の引数を受け入れたため、(1..10).inject&:*のようなクールなたわごとを実行できましたが、主な使用例は、多くの場合、コレクション%g(クイックブラウンフォックス).map&:upcase。1.8.7以降はルビーのコアであり、パフォーマンスは妥当です。
スティーブグラハム

4
@thenduks:そして、それはruby 1.8.7と1.9ではactivesupportの助けなしで行うことができます。
Andrew Grimm、

28

最後の1つ-ルビでは、文字列を区切る任意の文字を使用できます。次のコードを見てください。

message = "My message"
contrived_example = "<div id=\"contrived\">#{message}</div>"

文字列内の二重引用符をエスケープしたくない場合は、単に別の区切り文字を使用できます。

contrived_example = %{<div id="contrived-example">#{message}</div>}
contrived_example = %[<div id="contrived-example">#{message}</div>]

区切り文字をエスケープする必要を回避するだけでなく、これらの区切り文字を使用して、より良い複数行の文字列を作成できます。

sql = %{
    SELECT strings 
    FROM complicated_table
    WHERE complicated_condition = '1'
}

19
ない任意の文字、それはまだかなりクールです。他のリテラルでも機能します:%()/%{} /%[] /%<> /%|| %r()/%r {} /%r [] /%r <> /%r || %w()/%w {} /%w [] /%w <> /%w ||
Bo Jeanes、2010年

herenowドキュメントの構文もあります:私はなど、複数行のSQL文のようなもののために使用したい<< BLOCK ... BLOCK、
マーティンT.

26

define_methodコマンドを使用して動的にメソッドを生成すると、非常に興味深く、あまり知られていません。例えば:

((0..9).each do |n|
    define_method "press_#{n}" do
      @number = @number.to_i * 10 + n
    end
  end

上記のコードは、「define_method」コマンドを使用して、「press1」から「press9」までのメソッドを動的に作成します。本質的に同じコードを含む10のメソッドすべてを入力するのではなく、define methodコマンドを使用して、必要に応じてこれらのメソッドを即座に生成します。


4
define_methodの唯一の問題は、Ruby 1.8ではブロックをパラメーターとして渡すことができないことです。回避策については、このブログ投稿を参照してください。
Andrew Grimm

26

Rangeオブジェクトを無限遅延リストとして使用します。

Inf = 1.0 / 0

(1..Inf).take(5) #=> [1, 2, 3, 4, 5]

詳細はこちら:http : //banisterfiend.wordpress.com/2009/10/02/wtf-infinite-ranges-in-ruby/


リンクされた記事のlazy_selectは非常にきれいです。
ジョセフ

これは本当に素晴らしいです。私はこれを試したとき、Infinityがどのようにフロートであるかを気に入っています。:D
zachaysan

23

module_function

module_functionとして宣言されたモジュールメソッドは、モジュールを含むクラスにプライベートインスタンスメソッドとして自身のコピーを作成します。

module M
  def not!
    'not!'
  end
  module_function :not!
end

class C
  include M

  def fun
    not!
  end
end

M.not!     # => 'not!
C.new.fun  # => 'not!'
C.new.not! # => NoMethodError: private method `not!' called for #<C:0x1261a00>

引数なしでmodule_functionを使用すると、module_functionステートメントの後にあるモジュールメソッドはすべて自動的にmodule_functionsになります。

module M
  module_function

  def not!
    'not!'
  end

  def yea!
    'yea!'
  end
end


class C
  include M

  def fun
    not! + ' ' + yea!
  end
end
M.not!     # => 'not!'
M.yea!     # => 'yea!'
C.new.fun  # => 'not! yea!'

4
モジュールでプライベートメソッドを宣言するだけの場合は、privateキーワードを使用します。module_functionは、モジュールを含むクラスでメソッドをプライベートにするだけでなく、メソッドをモジュールインスタンスにコピーします。ほとんどの場合、これはあなたが望むものではありません。
tomafro 2009

私はあなただけのプライベートを使用できることを知っています。しかし、これはRubyの隠し機能に関する質問です。そして、ほとんどの人はドキュメントでそれを見て、それをいじり始めるまで、module_function(自分自身を含む)について聞いたことがないと思います。
ニュートンアップル、2009

module_function(2番目の方法)を使用する代わりに、次のように使用することもできますextend self(かなり見栄えがよい:D)
J -_- L


21

警告:このアイテムは投票されました#1 2008年の最も恐ろしいハックので、注意して使用してください。実際、疫病のようにそれを避けてください、しかしそれは最も確実に隠されたルビーです。

スーパーレーターがRubyに新しいオペレーターを追加

あなたのコードのユニークな操作のために超秘密のハンドシェイク演算子が必要ですか?コードゴルフをするのが好きですか?-〜+〜-または<---などの演算子を試してください。最後の演算子は、アイテムの順序を逆にする例で使用されています。

私はそれを賞賛する以上に、Superators Projectとは何の関係もありません。


19

私はパーティーに遅れましたが、

簡単に2つの同じ長さの配列を取得して、1つの配列がキーともう1つの値を提供するハッシュに変換することができます。

a = [:x, :y, :z]
b = [123, 456, 789]

Hash[a.zip(b)]
# => { :x => 123, :y => 456, :z => 789 }

(これは、Array#zipが2つの配列の値を「圧縮」するため機能します。

a.zip(b)  # => [[:x, 123], [:y, 456], [:z, 789]]

そして、Hash []はまさにそのような配列を取ることができます。私も人々がこれをするのを見てきました:

Hash[*a.zip(b).flatten]  # unnecessary!

同じ結果が得られますが、スプラットとフラット化は完全に不要です-おそらく、それらは過去になかったのでしょうか?)


3
これは確かに長い間文書化されていませんでしたredmine.ruby-lang.org/issues/show/1385を参照)。この新しいフォームはRubyの1.8.7に新規であることに注意してください
マルク=アンドレ・Lafortune

19

Rubyの自動活性化ハッシュ

def cnh # silly name "create nested hash"
  Hash.new {|h,k| h[k] = Hash.new(&h.default_proc)}
end
my_hash = cnh
my_hash[1][2][3] = 4
my_hash # => { 1 => { 2 => { 3 =>4 } } }

これはとても便利です。


1
私はネイティブのハッシュのinitのような同じ気持ちを持っているモジュールでそれをラップします:module InfHash; def self.new; Hash.new {|h,k| h[k] = Hash.new(&h.default_proc)}; end; end
asaaki

16

配列の破壊

(a, b), c, d = [ [:a, :b ], :c, [:d1, :d2] ]

どこ:

a #=> :a
b #=> :b
c #=> :c
d #=> [:d1, :d2]

この手法を使用すると、単純な割り当てを使用して、任意の深さのネストされた配列から必要な正確な値を取得できます。


15

Class.new()

実行時に新しいクラスを作成します。引数は派生元のクラスにすることができ、ブロックはクラス本体です。あなたはまた、見たいかもしれないconst_set/const_get/const_defined?、新しいクラスが正しく登録さ得るためになるようにinspect名前の代わりに、多数のうちプリント。

毎日必要なものではありませんが、必要なときにとても便利です。


1
MyClass = Class.new Array do; def hi; 'hi'; end; endと同等のようclass MyClass < Array; def hi; 'hi'; end; endです。
yfeldblum 2009年

1
おそらく私が考えていたよりも本当だ。定数だけではなく変数から継承できるようにも見えます。ただし、実行時にクラス名を作成する必要がある場合、糖バージョン(2番目)は機能しないようです。(もちろん、評価を評価します。)
Justin Love

このテクニックは、本 『メタプログラミングRuby』でかなりよく説明されています。
Paul Pladijs、2011

13

連続する数値の配列を作成します。

x = [*0..5]

xを[0、1、2、3、4、5]に設定します


うん、でもそれは短くて甘いわけではありません;)
horseyguy

2
簡潔さは客観的で、読みやすさは好みと経験の問題です
Alexey

splat(*)演算子は基本的にto_aとにかく呼び出します。
Matheus Moreira

13

Rubylandで見られる魔法の多くは、メタプログラミングに関係しています。メタプログラミングは、コードを記述するコードを記述するだけです。Rubyのattr_accessorattr_readerattr_writer彼らは標準パターン、次の1行に2つのメソッドを、作成することで、全てのシンプルなメタプログラミングされています。Railsは、has_oneやなどの関係管理メソッドを使用して、多くのメタプログラミングを実行しますbelongs_toます。

しかし、class_eval動的に記述されたコードを実行するためにを使用して独自のメタプログラミングトリックを作成するのは非常に簡単です。

次の例では、ラッパーオブジェクトが特定のメソッドを内部オブジェクトに転送できるようにします。

class Wrapper
  attr_accessor :internal

  def self.forwards(*methods)
    methods.each do |method|
      define_method method do |*arguments, &block|
        internal.send method, *arguments, &block
      end
    end
  end

  forwards :to_i, :length, :split
end

w = Wrapper.new
w.internal = "12 13 14"
w.to_i        # => 12
w.length      # => 8
w.split('1')  # => ["", "2 ", "3 ", "4"]

メソッドWrapper.forwardsは、メソッド名のシンボルを取り、methods配列に格納します。次に、与えられたそれぞれについて、define_method、すべての引数とブロックを含め、メッセージを送信するのが新しいジョブの作成します。

メタプログラミングの問題に関する優れたリソースは、なぜラッキースティフの「メタプログラミングを明確に見ること」です。


私はルビーのメタプログラミングに最初に飛び込みたいです。それを始めるためにいくつかの参照を提供できますか(与えられたリンク以外)本もやります。ありがとう。
Chirantan 2009

:PragProgのvideocastingのセリエA「のRubyオブジェクトモデルとメタプログラミング」ルビーを使用したメタプログラミングへの良い入門pragprog.com/screencasts/v-dtrubyom/...
caffo

@Chirantan、メタプログラミングRubyを見てください。
Paul Pladijs、2011

12

===(obj)ケースの比較には、対応するものを使用します。

case foo
when /baz/
  do_something_with_the_string_matching_baz
when 12..15
  do_something_with_the_integer_between_12_and_15
when lambda { |x| x % 5 == 0 }
  # only works in Ruby 1.9 or if you alias Proc#call as Proc#===
  do_something_with_the_integer_that_is_a_multiple_of_5
when Bar
  do_something_with_the_instance_of_Bar
when some_object
  do_something_with_the_thing_that_matches_some_object
end

Module(したがってClassRegexpDateおよび他の多くのクラスがインスタンスメソッドを定義:===(他)、及び全て使用することができます。

Ruby 1.9のようにエイリアスされることを思い出させてくれたFarrelに感謝します。Proc#callProc#===


11

「ルビー」バイナリ(少なくともMRI)は、perlワンライナーを非常に人気にした多くのスイッチをサポートしています。

重要なもの:

  • -n "gets"だけで外側のループを設定します-これは、指定されたファイル名またはSTDINで魔法のように機能し、各読み取り行を$ _に設定します
  • -p -nと同様ですがput、各ループ反復の最後に自動s が付きます
  • -a $ Fに保存されている、各入力行での.splitの自動呼び出し
  • -iインプレース編集入力ファイル
  • -l入力時の.chompの自動呼び出し
  • -eコードを実行します
  • -cソースコードをチェックします
  • -w警告あり

いくつかの例:

# Print each line with its number:
ruby -ne 'print($., ": ", $_)' < /etc/irbrc

# Print each line reversed:
ruby -lne 'puts $_.reverse' < /etc/irbrc

# Print the second column from an input CSV (dumb - no balanced quote support etc):
ruby -F, -ane 'puts $F[1]' < /etc/irbrc

# Print lines that contain "eat"
ruby -ne 'puts $_ if /eat/i' < /etc/irbrc

# Same as above:
ruby -pe 'next unless /eat/i' < /etc/irbrc

# Pass-through (like cat, but with possible line-end munging):
ruby -p -e '' < /etc/irbrc

# Uppercase all input:
ruby -p -e '$_.upcase!' < /etc/irbrc

# Same as above, but actually write to the input file, and make a backup first with extension .bak - Notice that inplace edit REQUIRES input files, not an input STDIN:
ruby -i.bak -p -e '$_.upcase!' /etc/irbrc

「ruby one-liners」と「perl one-liners」をググって、もっと便利で実用的な例がたくさんあります。基本的に、Rubyをawkおよびsedのかなり強力な代替として使用できます。


10

送信()メソッドは、Rubyで、任意のクラスまたはオブジェクトに使用することができる汎用的な方法です。オーバーライドされていない場合、send()はストリングを受け入れ、ストリングが渡されたメソッドの名前を呼び出します。たとえば、ユーザーが「Clr」ボタンをクリックすると、「press_clear」文字列がsend()メソッドに送信され、「press_clear」メソッドが呼び出されます。send()メソッドは、Rubyで関数を呼び出すための楽しくダイナミックな方法を可能にします。

 %w(7 8 9 / 4 5 6 * 1 2 3 - 0 Clr = +).each do |btn|
    button btn, :width => 46, :height => 46 do
      method = case btn
        when /[0-9]/: 'press_'+btn
        when 'Clr': 'press_clear'
        when '=': 'press_equals'
        when '+': 'press_add'
        when '-': 'press_sub'
        when '*': 'press_times'
        when '/': 'press_div'
      end

      number.send(method)
      number_field.replace strong(number)
    end
  end

この機能については、Blogging Shoes:Simple-Calcアプリケーションで詳しく説明します


セキュリティホールを開ける素晴らしい方法のように聞こえます。
mP。

4
可能な限り記号を使用します。
2010

9

一部のクラスまたはモジュールをだまして、本当に必要ではないものを必要としていることを伝えます。

$" << "something"

これは、たとえばAが必要で、次にBが必要であるが、コードでBが必要ない場合に便利です(そして、AはコードでBを使用しません)。

たとえば、Backgroundrb bdrb_test_helper requires 'test/spec'は使用しますが、まったく使用しないので、コードでは次のようになります。

$" << "test/spec"
require File.join(File.dirname(__FILE__) + "/../bdrb_test_helper")

これは、gem Aがfoo-1.0.0を必要とし、gem Bがfoo-1.0.1を必要とする問題を修正しますか?
Andrew Grimm、

「何か」のコードが利用できないため、これはありません。これは、「何か」が必要であることをシミュレートするだけですが、実際には必要ありません。$ "はrequireによってロードされたモジュール名を含む配列です(requireによって使用され、モジュールが2回ロードされるのを防ぎます)。これを使用してgemをだますと、gemが実際の「何か」を使用しようとするとクラッシュします。最新のコードではなく、gemの具象バージョン(例:foo-1.0.0)を強制的にロードしたい場合があります:docs.rubygems.org/read/chapter/4#page71
olegueret 2010年

9

Fixnum#to_s(base)場合によっては非常に便利です。このようなケースの1つは、36の基数を使用して乱数を文字列に変換することにより、ランダムな(擬似)一意のトークンを生成することです。

長さ8のトークン:

rand(36**8).to_s(36) => "fmhpjfao"
rand(36**8).to_s(36) => "gcer9ecu"
rand(36**8).to_s(36) => "krpm0h9r"

長さ6のトークン:

rand(36**6).to_s(36) => "bvhl8d"
rand(36**6).to_s(36) => "lb7tis"
rand(36**6).to_s(36) => "ibwgeh"

9

任意の数のパラメーターを受け入れ、それらをすべて破棄するメソッドの定義

def hello(*)
    super
    puts "hello!"
end

上記のhelloメソッドputs "hello"は画面上で呼び出すだけで済みますsuperが、スーパークラスhelloはパラメータを定義する必要があるため、同様に必要があります。ただし、実際にはパラメータ自体を使用する必要がないため、名前を付ける必要はありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.