問題タブ [implicit-conversion]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scala - うまくバリアントタイプを持つTraversableLike.mapのアナログで「ライブラリをポン引き」できますか?
map
Scalaのような機能を追加したいとします。これはList
、の行に沿ったもので、関数を2回の各要素にlist mapmap f
適用します。(より深刻な例は、並列マップまたは分散マップの実装ですが、その方向の詳細に気を取られたくありません。)f
list
私の最初のアプローチは
これは今うまくいきます
もちろん、それはs専用であり、 sやsなどの関数を使用して、List
これを何に対しても機能させたくない理由はありません。したがって、2回目の試行は次のようになりますTraverseable
map
Set
Stream
しかし、もちろん、結果をList[A]
:に割り当てることはできません。
妥協点はありますか?Traversableのすべてのサブクラスにメソッドを追加し、そのタイプのオブジェクトを正常に返す暗黙の変換を記述できますか?
(これには恐ろしいCanBuildFrom
特性を理解することが含まれると思います、そしておそらくbreakout
!)
c# - クラスが C# で暗黙的に文字列に変換されるようにするにはどうすればよいですか?
これが私がやりたいことです...
だから私はどのよう a
に変換されるかを制御したいString
…どういうわけか…
sql - SQL の型比較
SQL クエリの一部として、次のコードを取得しました。
このコード@SortValue
は、整数 (LabelId
は int でもあります) または区切り文字で区切られた整数 (たとえば、SortValue 420|421| は 420 および 421 と比較されます) である限り正常に機能します。ただし、 の非整数値を含む機能を追加しています@sortValue
。例: 420、ABC、および 421 と比較する420|ABC|421|
必要があります。
心配はいらない、と私は思った。そのクエリの最後の行を変更するだけです。
残念ながら、@sortValue
文字を入力するとエラーが発生します。の向こう側には決して到達しませんでしたor
。
いろいろ調べた結果、SQL が StringSplitter 関数からの文字列結果をキャストして、LabelId と比較していると最終的に判断しました。文字列の結果に数値のみが含まれることが保証されている場合は問題ありませんが、SQL は (当然のことながら) 数値以外の文字列を int にキャストすることを拒否し、エラーをスローします。
必要な機能を維持しながら、このエラーを回避する最も簡単な方法は何ですか? データベースの相互作用のため、タイプの変更がLabelId
実行可能なオプションであるかどうかはわかりません。
scala - Scala2.8での暗黙の変換の問題
Tuple2 [A、B]からSeq [C]への暗黙の変換を記述したいと思います。ここで、CはAとBの両方のスーパータイプです。最初の試みは次のとおりです。
しかし、それは機能しません:
これが機能している間:
使用事例:
最初の解決策が期待どおりに機能しなかった理由がわかりません。 Scalaバージョン2.8.0.r22634-b20100728020027(Java HotSpot(TM)クライアントVM、Java 1.6.0_20)。
c++ - const_castとstatic_cast
const
非constオブジェクトに追加するには、どちらが推奨される方法ですか?const_cast<T>
またはstatic_cast<T>
。最近の質問で、誰かが使用することを好むと述べましたが、それによってコードの意図がより明確になるstatic_cast
と思いました。では、変数constを作成するconst_cast
ために使用するための引数は何ですか?static_cast
c# - C# での暗黙的な変数代入の例
C# でこのようなことができることに気付きました。
文字列値が暗黙的に別の型に変換されることに注意してください。これを行うことができる他の場所はありますか?この種のことに関する一般的なパターンと慣行は何ですか?
scala - カリー化とアンカリー化がscalaで暗黙的ではないのはなぜですか
関数がある場合:
(A, B) => C
関数が期待される場所で使用できるように、暗黙的な変換を定義できます。これは逆方向にも行きます。
これらの変換が暗黙的でない (または暗黙的に利用可能でない) のはなぜですか? 私は、悪いことのいくらかの価値のために悪いことが起こる可能性があると仮定しています。これは何の値ですか?
scala - Scala:リターンタイプをカスタムトレイトに変換する
Iterator [A]を拡張するカスタムトレイトを作成しましたが、別のメソッドから返されるIterator[A]で作成したメソッドを使用できるようにしたいと思います。これは可能ですか?
私はまだ暗黙のこと全体に頭を悩ませようとしていて、Bar
オブジェクト定義にメソッドを書くようなものはあまりありません。そのようなアイテムを上記のように機能するようにラップするにはどうすればよいですか?
scala - Scalaでは、なぜ `println(1,2)`が機能するのですか?
Scala(2.7.7final)では、Predef.println
メソッドは次のシグネチャを持つものとして定義されています。
どうして、次のことが機能するのでしょうか。
コンパイラは、コンマで区切られた引数のリストをタプルに自動的に変換しますか?どんな魔法で?ここで暗黙の変換が行われていますか?もしそうなら、どれですか?
c# - 同等の暗黙の演算子:なぜそれらは合法ですか?
アップデート!
以下のC#仕様の一部の私の分析を参照してください。この質問で説明している動作は実際には仕様に違反しているように見えるので、何かが足りないに違いないと思います。
アップデート2!
OK、さらに考えてみると、いくつかのコメントに基づいて、私は今何が起こっているのか理解していると思います。仕様の「ソースタイプ」という言葉は、変換元のタイプを指します。つまり、Type2
以下の例では、コンパイラが候補を定義された2つの演算子に絞り込むことができることを意味します(Type2
ソースタイプであるため)。両方のための)。ただし、これ以上選択肢を絞り込むことはできません。したがって、仕様のキーワード(この質問に適用される)は「ソースタイプ」です。これは、以前は「タイプの宣言」を意味すると誤解していました(私は思います)。
元の質問
これらのタイプを定義したとします。
次に、私がこれを行うと言います:
implicit
どの演算子を使用すべきかが明確でないため、これは明らかにあいまいです。私の質問は-このあいまいさを解決する方法がわからないので(どのバージョンが必要かを明確にするために明示的なキャストを実行できるわけではありません)、それでも上記のクラス定義はコンパイルされます-なぜコンパイラは許可するのでしょうかそれらの一致するimplicit
演算子はまったく?
解剖
OK、これを理解するために、Hans Passantが引用したC#仕様の抜粋を見ていきます。
ユーザー定義の変換演算子が考慮されるタイプのセットDを見つけます。このセットは、S(Sがクラスまたは構造体の場合)、Sの基本クラス(Sがクラスの場合)、およびT(Tがクラスまたは構造体の場合)で構成されます。
(S)から (T )に変換しています。したがって、ここでDには、例の3つのタイプすべてが含まれているようです:(これはSの基本クラスであるため)、(T)、および(S)。Type2
Type1
Type0
Type1
Type2
該当するユーザー定義の変換演算子Uのセットを見つけます。このセットは、Sを含む型からTを含む型に変換する、Dのクラスまたは構造体によって宣言されたユーザー定義の暗黙的な変換演算子で構成されます。Uが空の場合、変換は未定義であり、コンパイル時エラーが発生します。
さて、これらの条件を満たす2つの演算子があります。で宣言されたバージョンは、がDであり、(明らかにSを含む)から(明らかにTを含む)に変換されるType1
ため、要件を満たしています。のバージョンも、まったく同じ理由で要件を満たしています。したがって、Uにはこれらの演算子の両方が含まれます。Type1
Type2
Type1
Type2
最後に、 Uの演算子の最も具体的な「ソースタイプ」SXを見つけることに関して:
Uの演算子のいずれかがSから変換される場合、SXはSです。
これで、Uの両方の演算子がSから変換されます。これにより、 SXがSであることがわかります。
Type2
これは、そのバージョンを使用する必要があるという意味ではありませんか?
ちょっと待って!よくわかりません!
演算子のバージョンのみを定義することはできませんでしType1
た。その場合、残りの候補はType1
のバージョンのみになりますが、仕様によればSXは次のようになりType2
ますか?これは、仕様で不可能なことが義務付けられている可能性のあるシナリオのようです(つまり、で宣言された変換はType2
、実際には存在しない場合に使用する必要があります)。