2016-08-27 8 views
0

私は、コードのいくつかの作品を持っている:それはサイズのケースとリターンに行くべきo = []についてルビー特別な使用方法は、

variable = ... 
case variable 
when ~:new 
    ':new method!' 
when ~:lenght 
    ':size method!' 
end 

「:!サイズメソッド」 o = Stringの場合は ':new method'を返します。 このパートでは、以下の実装方法を知っています しかし、どのような種類のオブジェクトでも動作するはずです。そして、この部分私は実装する方法を知らない。私のコードで何が間違っているのか分かりませんし、正しいのですか?私のコード:

module AbstractClass 
    def new; false end; 
    def size; false end; 
end 

class Class 
    include AbstractClass 
end 

class Array 
    include AbstractClass 
    def size; true end; 
end 

class String 
    include AbstractClass 
    def new; true end; 
end 

class Symbol 
    include AbstractClass 
    alias ~ to_proc 
end 

ありがとうございます!

+0

インデントを使用して書式を設定することも、エディタで '' '{}' ''ボタンを使用して書式設定することもできます。 –

+0

私はあなたが達成したいことを本当に理解していません。このすべての目標は何ですか? –

+0

これは運動であり、私はあなたに運動のジストを書いた。私のコードが十分ではないことを示す自動テストがあります。 Arrayは、 ':size method!'、String ':new method!'を返すべきだと言われています。どのような方法でも動作するはずです。私が知っていることはすべてそれだよ。 – Grunthor

答えて

1

私はあなたがここでやったことを知っています:)私はあなたにヒントを与えることができます。

重要なことは、Rubyでcase文がどのように機能するかを理解することです。

case variable 
when 1 
    # do stuff 
when "foo" 
    # do other stuff 
end 

Rubyが実際に呼び出している===方法これらの値に:あなたは、次のコードをお持ちの場合

1 === variable 
"foo" === variable 

それとも

1.===(variable) 
"foo".===(variable) 

順序はここでは重要です。これらは単なるメソッドなので、2つのオブジェクトの比較に関連するカスタム動作を提供するために、それらのオブジェクトをオーバーライドすることができます。

+0

私はあなたが何を意味しているのか知っていますが、すべての種類のオブジェクトに対してこれらのメソッドをオーバーライドする方法はありますか?これを 'Class'クラスでオーバーライドしますか? – Grunthor

+0

このタスクのテストケースは、newと:lengthの2つのメソッドより複雑です。任意のメソッド名のために働くより一般的な解決法を書くべきです –

+0

はい、いくつかの自動化されたテストがありますが、どう見ているかわかりません。私はエクササイズの本体にスイッチケースを備えたコードをいくつか持っています。私のソリューションは、新しいものと長さを定義するオブジェクトで動作しますが、どのような種類のオブジェクトでも動作するはずです。私が思ういくつかの卑劣な解決策があるはずです。 – Grunthor

関連する問題