Programmingバックエンド開発者

Kotlinのinfix関数とは何か、それを宣言し正しく使用する方法、そして制約は何か。独自のinfix関数を作成する例を示し、落とし穴について説明してください。

Hintsage AIアシスタントで面接を突破

回答。

Infix関数は、ピリオドやカッコなしで呼び出すことができる関数で、コードの可読性を向上させます。このような関数は、DSL(ドメイン特定言語)の作成に便利です。

Infix関数を宣言する方法:

  • 関数はクラスのメソッドまたは拡張関数でなければなりません。
  • 正確に1つのパラメータを持つ必要があります。
  • infix修飾子で宣言します。
  • varargとデフォルト値の使用は許可されていません。

例:

infix fun Int.add(x: Int): Int = this + x val result = 5 add 10 // 15

利点:

  • 読みやすさの向上、特に計算やメソッド呼び出しのチェーンにおいて。
  • コレクションの構築、条件のチェック(例えば、x to y)に利用できます。

制約と落とし穴:

  • Infixは1つの必須パラメータを持つメソッドに対してのみ使用可能です。
  • Infixの実行優先度は比較演算子や算術演算子より低いため、演算の優先度に驚くことがあります。
  • Infix関数はデフォルトパラメータやvarargでは機能しません。

ひっかけ問題。

複数のパラメータやデフォルトパラメータを持つinfix関数を使用できますか?

答え: いいえ、できません。Infix関数は、デフォルト値やvarargのない正確に1つの必須パラメータを持つことができます。

不適切な宣言の例:

// エラー! infix fun foo(a: Int, b: Int) { }

このトピックの細かい点を知らなかったための実際のエラーの例:


ストーリー

プロジェクトでは、builder関数の呼び出しをより読みやすいinfix表現に置き換えるためにinfix関数を導入しようとしました。パラメータ数の制限が分からず、2つのパラメータを持つ関数を宣言してしまい、学生たちはコンパイルが通らない理由を長い間理解できませんでした。


ストーリー

開発者は、大きな算術式の中でカッコなしでinfix表現を使用し、演算の優先順位が従来の数学演算子と同じだと考えていました。その結果、期待通りに式が計算されず、明示的なカッコを使用して書き直す必要がありました。


ストーリー

コレクション内でinfixを通じてparsing("item to value")を実装し、ネスティング内で使用しましたが、構文の誤解により2つの入れ子になったinfix呼び出しは機能しませんでした。最上位レベルでのペアの指定のみが機能し、入れ子のペアは無視されたため、重要なデータの損失につながりました。