2

Java でプログラミング中に起こったこと:

String str

// want to call something(), but signature does not match
something(Foo foo)

// but I have this conversion function
Foo fooFrom(String)

// Obviously I am about to create another method overload.. sigh
something(String s) {
    something(fooFrom(s));
}

fooFromしかし、Foo オブジェクトが除外される場所に文字列が渡されるたびに、定義した変換関数を使用するだけの「自動型変換」の可能性を考えました。

検索の結果、次のEiffel の例を使用した型変換に関するウィキペディアのページにたどり着きました。

class STRING_8
    …
create
    make_from_cil
    …
convert
    make_from_cil ({SYSTEM_STRING})
    to_cil: {SYSTEM_STRING}
    …

以降のメソッドconvertは、STRING_8 が SYSTEM_STRING として使用されている場合、またはその逆の場合に自動的に呼び出されます。これをサポートする他の言語を見つけることができなかったのは、なんとなく驚きでした。

私の質問: この機能をサポートする他の言語はありますか? そうでない場合、それは私にとって非常に便利だと思われるので、その理由はありますか? さらに、言語アドオンとして実装することも難しくないと思います。

4

4 に答える 4

1

物事をもう少し複雑にするかもしれない小さな点が 1 つあります。現時点では、Eiffel には、再接続のソースがオブジェクトにアタッチされている場合、つまりVoidでない場合( Java/C# ではnullでない場合) にのみ変換を適用できるというルールがあります。

元の例を見てみましょう。

something (str);

strnullであるとします。コードが次のように変換されるため、NullPointerException / InvalidArgumentExceptionが発生しますか

something (fooFrom (str));

fooFromはnullを想定していませんか? または、コンパイラはこれを次のように変換するのに十分スマートですか?

if (str == null)
    something (null);
else
    something (fooFrom (str));

?

現在の Eiffel 標準では、このような問題が発生しないようにし、変換が含まれる場合はstrnullにならないようにしています。ただし、Java や C# などの他の多くの言語ではそれが保証されておらず、追加の複雑さは努力する価値がない場合があります。

于 2012-11-06T09:30:54.513 に答える
0

型の強制(暗黙の変換) は、呪いでもあり祝福でもあります。便利な場合もありますが、逆効果になることもあります。

たとえば、Javascript には多くの奇妙な強制規則があり、文字列を数値に強制変換するときにバグが発生する可能性があります。

Scalaには「暗黙的」と呼ばれるものがあり、(少なくとも私にとっては) Eiffel で説明したものと同様のことを実現します。少しの驚きで、それらは特定の落とし穴につながる可能性があります。しかし、それらは非常に便利な場合もあります。たとえば、Pimp My Libraryの記事を参照してください。

于 2012-11-06T13:35:36.563 に答える
0

C++ には、コピー コンストラクターと代入演算子があります。

于 2012-11-09T12:58:49.180 に答える
0

Eiffel は変換ルーチンをサポートする唯一の言語ではないと思いますが、これを言語定義の残りの部分と非常にうまく統合している数少ない言語の 1 つかもしれません。

たとえば、.NET には、サポートする言語の変換に使用できる op_Explicit ルーチンと op_Implicit ルーチンの両方があります。そして、私はC#がそうだと信じています。

マヌー

于 2012-11-06T05:47:30.927 に答える