2016-06-26 8 views
2

Rubyを初めて使用しています関数の定義と変数代入で "ハッシュ"を使用

私が理解したいと思う以下のコードが見つかりました。

1)私は、初期化機能の最初のhashがパラメータであることを理解しています。ここでもhashは連想配列ですか?

2)hash['FILENAME']の2番目のハッシュは、関数defのパラメータを使用しているか、新しいハッシュ(つまり連想配列)を定義していますか?

3)self.myfilenameが要素値が'FILENAME'の配列に設定されているとしますか?

4)なぜ|| ""がありますか?

require 'rex/socket' 
require 'rex/proto/dhcp' 
module Rex 
module Proto 
module DHCP 

Class Server 
include Rex::Socket 
def initialise(hash, context={}) 
... 
self.myfilename = hash['FILENAME'] || "" 
... 
+1

最初の 'hash'は関数の定義にあります。つまり、それが何であるかは指定されていません。それは単なるプレースホルダです。 2つ目は、 'hash'という名前の連想配列が存在することを前提としています。 2番目の部分の行が関数定義の内側にある場合は、関数定義のパラメータを使用します。ダブルバーは 'or'を意味するので、実行時に関数に渡されたパラメータが 'FILENAME'要素を含む連想配列でない場合、' self.myfilename'は代替オプションに設定されます。 '' ''(つまり、空の文字列)。 –

+0

用語解説:「連想配列」とは、Rubyを含む非常に少数のプログラミング言語で使用される用語です。 (私が知っている唯一の主流の例外はPHPです。)これは、新規参入者が特別な種類の配列に対してハッシュを間違えさせるため、不幸な言葉です。Rubyには配列とハッシュがあります。それは、あなたがそれらが完全に異なるものであると考えるようになります。彼らが共通しているのは、角括弧( '#[]'というメソッド)を使って両方の要素にアクセスできるということだけです。 –

答えて

1

(1)はい、hashは、Pythonの辞書やJavaのHashMapに似た連想配列でなければなりません。 hashは、タイプHashの変数である必要があります。このように多くの情報があるとすれば、hashHashのタイプですが、変数の名前とそのアクセス方法を見ると、Hash["FILENAME"]Hashであるはずです。

(2)initializeメソッドで渡されたパラメータを使用しています。新しいものを定義していないHash

(3)self.myfilenamehashの 'key'に対応する 'value'に 'FILENAME'が設定されています。

(4)a = b || ""がrubyの場合、aにはbの値が割り当てられますが、bがnilの場合は空の文字列に設定されます。したがって、上記のコードでは、|| ""が追加され、ハッシュにキー 'FILENAME'がない場合、self.filenameにはnilではなく空の文字列が割り当てられます。

希望します。)

+1

私は実際にRubyを使用したことはありませんが、関数定義の 'hash'パラメータは単にキャストされていません。 #1で「ハッシュ」タイプのことをどのように伝えることができますか? –

+1

@JanusBahsJacquetあなたは正しいです。上記のコードでは、 'hash 'によって参照されるオブジェクトにString引数を受け入れる'#[] 'メソッドがあることだけが必要です。それがどのように使用されるかという手がかりを与える名前にもかかわらず、ハッシュである必要はありません。 –

+0

@JanusBahsJacquetあなたは正しいです。それは確かにハッシュである必要はありません。しかし変数名 'hash'からどのように' hash ["FILENAME"] 'にアクセスするのかを見ると、ハッシュでなければならないという非常に強い手がかりが与えられます。 –

1

ようこそ!
1)ここにあります。 contextのデフォルト値は{}です。
2)関数に与えられたhashパラメータを使用し、それはFILENAMEというキーをとります。
3)self.myfilenameは、FILENAMEの値がhashの値に等しい。
4)ハッシュにキーが含まれていない場合は、nilを返します。したがって、ここで|| ""self.myfilenameを空の文字列に設定し、nilではありません。

+0

だから、例えば 'initialise(test.txt、") ' - 関数' initialize 'を 'self.myfilename'が' hash [' test.txt ']とすると、 ""は 'text.txt'として保存されますか? –

+0

はい、そうです。しかし、それはむしろ奇妙な状況です。私は文字列を渡す理由を見ず、 '['test.txt']'を呼び出します。 – Aleksey

関連する問題