質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

Q&A

解決済

3回答

423閲覧

異なるインスタンスを参照しているメソッドを比較する場合、真偽判定している過程がわかりません。

mako_0221

総合スコア87

Dart

Dartは、Googleによって開発されたJavaScriptの代替となることを目的に作られた、ウェブ向けのプログラミング言語である。

0グッド

0クリップ

投稿2022/04/04 02:09

下記のように関数の等価性について、シンプルなコードで学んでおります。
そこで一つわからない点があります。
print(z.a==x.a);//fales *hereについてですが、
print(z.a==y.a);//true
とがtrueに対して、それぞれ異なるインスタンスを参照しに行っているので、結果としてfalseを返してくるという「結果」は理解しているつもりです。

一方で、print(z.a==x.a);//fales *hereの場合、この真偽判定の評価において、何をどのようにして異なるインスタンスを参照しているのだろうという過程がわかりませんでしたDartpadでfalseになった内容を出力しても、以下のように出力されるだけで、異なるインスタンス由来であるという、評価の過程を知ることができませんでした。

print(z.a);//'A'のインスタンスのクロージャ'a$ 0'
print(x.a);//'A'のインスタンスのクロージャ'a$ 0'

特にメソッド自体にhashCodeのような属性があるのかなとも思ったのですが、実際にはどのように異なるインスタンスにおけるメソッドであると評価しており、それを何かしら出力することにより確認する術はあるのでしょうか?

dart

1class A { 2 void a () {} 3} 4 5 6void main(){ 7 var x = new A(); 8 var y = new A(); 9 10 var z = y; 11 12 print(z.a==y.a);//true 13 print(z.a==x.a);//fales *here 14 print(z.a);//'A'のインスタンスのクロージャ'a$ 0' 15 print(x.a);//'A'のインスタンスのクロージャ'a$ 0' 16}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2022/04/04 02:18

それを知って、何かに応用したい状況なのでしょうか?
mako_0221

2022/04/04 03:51

コメントありがとうございます。 いいえ、応用したい状況はございません。 提示コードで理解したことは、同じクラスからでも異なる生成したインスタンスのメソッドは真偽判定上falseを返すという事実です。 私が初心者だからかもしれませんが、この事実だけでは、正しくこの==オペレーターで真偽判定を利用することができないと感じたからです。 「Aさんは有能」であるという事実を知っても、「Aさんは高身長なのか」、「Aさんは優しいのか」ということは判定できず、甲という属性を持つものは、有能であり、高身長で優しいという特性を持っている。ここで「Aは甲である」という3段論法でしか理解ができない頭で、ともすればこれがプログラミング向きではない思考なのかもしれません。。。 そういう意味で、ここでの真偽判定の本質(甲)を知りたい、という趣旨での質問でございました。
guest

回答3

0

この事実だけでは、正しくこの==オペレーターで真偽判定を利用することができないと感じたからです。

その感覚は、もしかしたら妥当ではないかもしれません。

プログラミング言語には、明文化された「仕様」と、それを実現するための「実装」という2つのレイヤーがあります。そして、仕様以上に実装は変化しうる(同じ言語でも、環境や処理系によって異なることもありうる)ものです。

「速度やメモリ消費量など、実装に起因する問題を抱えている」、「特定の実装に依存しなければ書けないコードがある」、「処理系自身やプラグインを作るなど処理系内部の開発を行う」など特別な事情がある場合を除いて、仕様だけをもとにして(細かな実装状況はあえて無視する形で)コードを書くべき、と考えます。

投稿2022/04/04 04:29

maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mako_0221

2022/04/04 14:55

ありがとうございます。 今回で言えば、 仕様としては「Test whether another object is equal to this function」であることだけをもとにコードを記載して、それを内部的にどのように実装されているのか(例えば、hashの一致をもとに判断しているかといったもの)は敢えて無視する形で というように解釈いたしました。 ご質問当初、この仕様が載っている箇所のご案内がなかったため、「どのように真偽判定をしているのか」という問題をどちらかというと、実装というより仕様のレベルで考えていたのですが、皆さまとコミュニケーションをとる中で、どちらかというと実装レイヤーの話なのだということに気づかされました。 まだまだ、不安内のため、今後同じような問題にあたったときに、それが仕様の話なのか、実装の話なのか対応するDocsを見つけ出して判断するためにはもっと経験と知識を積まなければならないと感じた次第ですが、仰って頂いたことやご指摘につきましては、理解を得ることができました。 改めて御礼申し上げます。
guest

0

ベストアンサー

Dartの関数はFunction派生のオブジェクトになるので、以下のページの説明が該当するのかと思います。

https://api.dart.dev/stable/2.16.2/dart-core/Function/operator_equals.html

静的関数やトップレベル関数は同じ。
同一オブジェクトのメソッドは同じ。
てな感じでしょうか。

メソッドのオブジェクトに関する情報を得るには、dart:mirrorsがリフレクションライブラリなので、
例えば、reflect(x.a)とすると、メソッドの情報(たぶんClosureMirror)が得られます。

上の例で言うと、x.aとy.aではオブジェクトのハッシュコードは異なっていると思います。

実際の比較処理がハッシュコードをベースにしているのか、それとも違う方法を採用しているのかどうかについてはFunctionの==の実装を追っていかないと分からないです。

投稿2022/04/04 03:14

ta.fu

総合スコア1667

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mako_0221

2022/04/04 03:38

コメントありがとうございます。 前段について、Dart:core ライブラリの中で、==で他のオブジェクトと等しいかを検証できる仕様であることは理解できました。 一方で、前回もdart:mirrorsがリフレクションライブラリの存在をご教示頂き、今後コードを書きながら深く理解するために、利用してみたいと考えていたのですが、利用しているFlutterプラットフォームでは使用できないことが整理できました↓ https://github.com/flutter/flutter/issues/1150 この結論に行き着くだけでも、初心者のため、相当な時間を要してしまい申し訳ございません。Flutterでも近い役割を持つ利用可能なライブラリなどはあるかなど、次の段階として調べているところです。 >実際の比較処理がハッシュコードをベースにしているのか 承知をいたしました、ご教示いただきありがとうございます。
mako_0221

2022/04/04 14:59

コメントありがとうございます。 実装部分には立ち入ることが必ずしも正しくないというコメントを頂いており、その部分を理解したつもりですが、これを機会に、一般的にどのように実装部分が記載されているものなのか、見てみようと思います。 と申し上げても、先ほど、コードを上から読み始めてみたところ、これがまだまだ不案内な私には、高い壁であることはすぐ理解できました。少しずつでも読み解けるように尽力を致します。
guest

0

operator == method - Function class - dart:core library - Dart API

if they refer to the same member method extracted from the same object.

とのことです。


ちなみに、

特にメソッド自体にhashCodeのような属性があるのかなとも思った

あります。確認してみてください。

投稿2022/04/04 03:01

ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mako_0221

2022/04/04 03:45

core libraryの該当箇所につき、ご教示いただきありがとうございます。オペレータとしての仕様について確認することができました。 "特にメソッド自体にhashCodeのような属性があるのかなとも思った" という私の表現があまり適切ではなかったのかもしれません。該当するメソッドを含むオブジェクトに対するhashCodeであれば存在するという意味では確認をいたしました。下記のように、それぞれのオブジェクトに対するハッシュコードという意味では相違するものが得られることは確認しております。 しかしながら、これがcore libraryでいう"Test whether another object is equal to this function."の真偽値の判定にどのような影響を与えているのかは、ta.fu様がコメントされている通り、深い部分まで理解しなければわからないことなのかもしれないと感じた次第でございます。 class A { void a () {} } void main(){ var x = new A(); var y = new A(); var z = y; print(z.a==y.a);//true print(z.a==x.a);//fales print(x.hashCode);780582908 print(z.hashCode);277005696 print(y.hashCode);277005696 }
ozwk

2022/04/04 06:22

ということであればmaisumakunさんの回答のように、 ある機能を使う分には実際にどう実装されているかに立ち入らず、仕様をもとにしてコーディングをすべきだと思います。
mako_0221

2022/04/04 14:56

ありがとうございます。 上記でもコメントを差し上げましたが、目の前にある問題が、仕様なのか実装なのかを判断するための経験と知識を得ていく必要がありますが、ご指摘は理解することができました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問