2017-11-01 8 views
-2

:xyz == 'xyz'falseであることを確認しました。しかし、レール内の関数を:indexまたは'index'と呼ぶことができます。私の不思議をクリアしてください。シンボルの違いは何ですか?

+1

_「関数内部では関数を呼び出すことができます」_ - – Stefan

+0

はレールコントローラ内で機能します。 –

+0

def indexは、redirect_to 'index'またはredirect_to:index bothを使用してリダイレクトできます。両方が同じ理由であるかどうか尋ねる。それがクリアされた。ありがとう –

答えて

0

:xyzはシンボルです。シンボルはクラスSymbolのインスタンスです。

"xyz "という文字列である。文字列がシンボルでない。したがって

:xyzあるSymbolのインスタンスは文字列xyzのインスタンスと等価ではないので、:xyz=='xyz'は真ではない。

+3

'1.0'は' Float'、 '1'は'整数 'です。 'Integer'は' Float'ではありません。それにもかかわらず、「1.0 == 1」は「真」である。 – Stefan

+1

@Stefan:どのようなパズル! –

+0

@SergioTulentsevは確かに少し秘密です。だから、結論は、「文字列は記号ではないので、私は指摘していない」と指摘したかった。 – Stefan

4

:xyz'xyz'は実際には異なります。これは、メソッドがいずれかの型の引数を取ることができるという事実と矛盾しません。例えば、Array#*は、引数としてStringまたはIntegerをとることができます。

["a", "b"] * "foo" # => "afoob" 
["a", "b"] * 2 # => ["a", "b", "a", "b"] 

それは"foo"2と同じであることを意味するものではありません。

あなたが暗示しているロジックに従えば、Rubyのすべてのオブジェクトが同じであることを意味します。

3

私は:xyz == 'xyz'falseであることを確認しました。しかし、我々は:indexまたは'index'とレールの内側の関数を呼び出すことができます。私の不思議をクリアしてください。

これについて不思議なことは何もありません。

Symbol#==は他の方法と同様の方法です。それを書いた人は、falseを返すように書いた。彼女はtrueを返すか、42を返すか、あなたのハードディスクをフォーマットするよう書いたかもしれませんが、彼女はfalseを返すことに決めました。

Railsメソッドは他のメソッドと同様のメソッドです。それらを書いた人は、SymbolまたはStringのいずれかを受け入れるように書いた。彼女はSymbol秒かString秒しか受け入れないように書いてもいいし、週の偶数日にString秒しか受け入れることができず、満月の間にはIntegersだけだが、彼女はStringSymbolの両方を受け入れます。

Rubyを書く開発者とRubyを書く開発者は、あなたが書いたメソッドで自由にできるように、自由に自分のメソッドで自由に行うことができます。 Stringを受け入れるメソッドを書くことができます。Symbolを受け入れるメソッドを書くことができます。両方を受け入れるメソッドを書くことができます。どちらも受け入れないメソッドを書くことができます。 RailsとRubyの開発者の選択と同じように、あなたの選択です。

SymbolStringの間の関係については絶対に何も意味しません。

+0

はい、それは自由意志開発者がプロ​​グラミング言語で行っているように、その背後には理由/論理的な説明があります –

2

RailsのHashWithIndifferentAccessの使い方を知っていると思います。これにより、シンボルまたは文字列のいずれかを使用してハッシュにアクセスできます。

つまり、内部でHashWithIndifferentAccessがすべてのキーを文字列に変換するため、params[:a]params["a"]と同じです。

詳細については、documentationを参照してください。

関連する問題