暗黙的および明示的な用語は、最初にそれらを聞くときに慣れています。 プログラミングの面でそれらを聞くとき、それはあなたにとって正確に何を意味し ある方法は別の方法より優れていますか? ここまでの進行それぞれのアイデアを事例とデザインパターンの特典コンがデスクトップから消えてしています。

用語

プログラミングでは、暗黙は、舞台裏で他のコードによってあなたのために行われた何かを参照するためによく使用されます。, Explicitは、明示的に実行する指示を書き出すことによって、必要な変更を達成するための手動のアプローチです。 小さい図では、暗黙的および明示的は、しばしばあなたがそれを持っているであろう型に型をキャストするために使用される用語です。 より大きな図では、規約はコードベースまたはフレームワークによって暗黙的に行われるものであり、構成は単に明示的な設定である構成よりも規約について話すかもしれません。,

問題のプログラミング言語、および言語が静的に型付けされているか動的に型付けされているかによって、どちらの使用にも適切性または利 また、実行時から推測できるのか、コンパイル中から推測できるのかにも依存します。 これらの要因のために、ある方法論が別の方法論よりも優れていると主張することは、問題のプログラミング言語やプログラムの設計を考慮する必,

cにおける暗黙的および明示的な型キャストの例は次のとおりです。

int implicit;implicit = 4.5;int explicit;explicit = (int)4.5; 

ここで、変数名implicitおよびexplicitタイプintであるように定義されていました。 値が与えられると4.5暗黙のバージョンでは、コンパイラは通常float型またはdouble型を整数に変換しますが、明示的なバージョンでは(int)を使用してそれを明示的に整数にキャストしますタイプをキャストするものです。,

静的に型付けされた言語

Rustのような静的に型付けされた言語では、コンパイラが型を推測できる場所を除いて、大部分の値の作成と割り当てに明示的な型注釈の要件があります。 以下は、Rustの明示的および暗黙的な型を示す例です。

fn add_one(input: u8) -> u8 { input + 1}let four = add_one(3);

ここでは、メソッドadd_one入力タイプと出力タイプについて明示的です。, ここに追加される番号1は、コンテキストがu8のタイプと追加を推測するのに役立つため、コンパイル時にu8u8で動作するようにのみ実装されているため、コンパイル時に暗黙的にu8番号になります。 メソッド自体が返される型を定義しているため、最後の行は暗黙的にu8になるように型指定されます。

rustで推論できることは、ジェネリックを使用することでかなり印象的です。 しかし、推論の使用は、コンパイル時に知ることができるものに限られています。, コンパイル時にそれがわからない場合は、割り当ての任意の時点で明示的に型を定義する必要があります。 次のメソッド定義を取ります。

use std::ops::Add;fn add_both<T: Add>(a: T, b: T) -> T::Output { a + b}

ここでTトレイトAddを実装する任意の型にすることができます。 ザT::Outputタイプは、Addトレイトが特定のタイプに対して定義されているときに定義され、通常と同じタイプですTこの場合 ここで、パラメータとして二つの数値を指定すると、コンパイラはその型を推測します。,

let x = add_both(3 , 4 ); // implicit typelet y: u8 = add_both(3u8 , 4u8 ); // explicit typelet z: u32 = add_both(3u32, 4u32); // explicit type

上記のコードを実行すると、xタイプであると推測されますi32yおよびz例では、T::Outputの推論として関数に提供されるときに入力パラメータ型が既知である必要があります。tが推論されるものと必ずしも同じではありません。 デフォルトはi32、次にi32u8またはu32として割り当てます。,

動的型付け言語

動的型付け言語では、型自体についてはあまり心配する必要がなくなり、暗黙的または明示的なオブジェクトまたは振る舞いについてもっと心配する必要があります。 同じ動作を持つオブジェクトの周りのコードをモデリングすることは、それらのオブジェクトを扱うことが暗黙であるオブジェクト指向プログラミ は、モデリングのコードの特定のオブジェクトクラスは利用明示的又は黙示的に示文字を入力す, しかし、あらゆる種類のオブジェクトを入力として受け入れる場合、そのセクションのコードは、異なるオブジェクトを明示的に処理するか、その責任を明確にするために、さまざまな種類のものを処理するコードを書いているときは、明示的なコードを書いています。 しかし、この同じコードがすでに記述されており、単純なメソッド呼び出しで再利用している場合、この新しいコンテキストでの動作は暗黙的です。 暗黙のことは、現在のスコープの外で自動的に処理されるかのように行われます。,

Rubyでは、ほとんどの型は明示的または暗黙的な変換のための設計を持っています。 アイデアは、暗黙の変換メソッドは暗黙のコンテキストで使用されることを意図しており、明示的な変換は開発者がはるかに多くのコンテキストで これを例で示しましょう。

# explicit"4".to_i + "5".to_i# => 9# implicitclass Seven def to_int 7 endendArray.new(Seven.new)# => 

ここでの明示的な例は、StringオブジェクトをIntegerオブジェクトに変換し、両者の間の加算を実行していることを読者にとって非常に明白にします。, また、暗黙の例は、Array.newメソッドが指定されたパラメータに対して暗黙的にto_intメソッドを呼び出すため、読者にとってはそれほど明 Integerクラスには、単純にselfを返す各インスタンスに対してto_intメソッドが定義されています。 あなたが書く場合42.to_intあなたは単に戻って取得します42。 メソッド呼び出しの入力ガードとして暗黙的な変換を使用するこの使用は、設計による型の安全性のための優れた設計です。 ここでは、to_intを定義していない入力として間違った種類のオブジェクトを指定するとどうなりますか。,

Array.new("32")# TypeError (no implicit conversion of String into Integer)

失敗するだけでなく、暗黙の変換が試みられたという有用なメッセージを与え、指定されたオブジェクトのクラスとそれが期待するオブジェクトのクラスを伝えます。 Rubyの暗黙の変換方法は、このオブジェクトが本当にあなたが期待しているものであると言う方法です。 明示的な変換は、単に期待される型への変換を行うことです。

Rubyには、多くのコアオブジェクトに対して暗黙的および明示的なオプションがあります。,Rubyには、暗黙の変換を行うか、nilを返すクラスメソッドを持ついくつかのクラスがあり、そのメソッド名はtry_convert

Rubyの例に従うことができますArray.new独自のカスタム型の暗黙の変換を設計することによって、与えられた入力パラメータの種類 この例では、to_fはRubyの浮動小数点数への明示的な変換であるため、as_をプレフィックスとしてto_の代わりに使用します。, ここでは、安全のためのパターンとしてのimplicitnessの基本的な例を示します。

これは、Barクラスを使用する他の開発者が、互換性のないパラメータとして渡さないようにするのに役立ちます。 これはRuby言語内の規則に従っており、開発者がより役に立つエラーで理解するのがはるかに簡単です。 Fooオブジェクトに変換したい他のオブジェクトがある場合は、明示的な変換のためにas_fメソッドを定義することができ、その新しいオブジェクトを使用する開発者はBar.new(Baz.new.as_f)を使用することで明示的になります。, これにより、BarFooがすでに機能しているようにコードが機能することが保証されます。

Summary

暗黙的および明示的なコーディング、および暗黙的および明示的なコードの行為は、追加の動作またはタイプ設定/キャストの実行のコンテキストによって定義されます。 具体的には、暗黙的または明示的なメソッドは、それらが使用されることが意図されている文脈によって定義される。 暗黙的なコードできる非常に素敵な経験がもともとでも簡単です。,

しかし、暗黙のコード、あなたのために舞台裏で物事を行うコードは、間違って行われたときに解決するのが難しい問題になることもあります。 明示的なコードは、何が行われているかの詳細がすでにあなたの前にレイアウトされており、他の場所で問題を追跡する必要はありませんが、一般的に それ自体では圧倒的になる可能性があるので、両者の間の適切なバランスを見つけることがしばしば最良の解決策です。 必要なときは明示的に、デザインと命名の概念が理解しやすいときは暗黙的に指定してください。, それはより便利な開発の経験のために作ります。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です