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

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

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

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

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

Q&A

解決済

1回答

393閲覧

WordPairクラスの()表示は何者でしょうか?

mako_0221

総合スコア87

Flutter

Flutterは、iOSとAndroidのアプリを同じコードで開発するためのフレームワークです。オープンソースで開発言語はDart。双方のプラットフォームにおける高度な実行パフォーマンスと開発効率を提供することを目的としています。

Dart

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

0グッド

0クリップ

投稿2022/05/19 16:33

以下のコードのように、aをコンソールに出力する場合、()に囲まれて出力されます。WordPairのドキュメンテーションを拝見しても何者であるのかわかりませんでした。

これを.toString()すれば下記のように(lacktip)のようにそのまま文字列として出力されますし、
リストにしてaddAll() するとなぜか取り除かれています。
Swiftで学んだタプル(tuples)に形式は似ているように思えるのですが、同じタプル型でList.addAll()のような形でList型に格納できると言うことなのでしょうか?

Dart

1import 'package:flutter/material.dart'; 2import 'package:english_words/english_words.dart'; 3 4void main(){ 5 final list = <WordPair>[]; 6 final a = generateWordPairs().take(1); 7 print(a);//(tentmail) 8 print(a.toString());//(lacktip) 9 list.addAll(a); 10 print(list);//[fastcamp] 11}

※なぜ、同じランダムキーワードの結果をaに格納しているのに、得られる結果がprintするたびに異なるのも謎なのですが、これまたドキュメンテーションにはどの時点で生成されるのか載っていないのですが、少し意味のわからない気持ち悪さがあります・・・

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

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

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

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

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

hoshi-takanori

2022/05/19 18:54

generateWordPairs() のドキュメントページにソースコードが載ってますが、戻り値は Iterable<WordPair> で、内部で無限ループして yield してるので、本来は無限に続くものを take(1) で 1 個だけ取り出してるってことでは。試しに take(2) とか take(5) とかに変えてみたらどうなりますか? そして、take(1) してるのに内容が毎回変わるのは気持ち悪いですが、そういう手抜き実装なんでしょうね…。
mako_0221

2022/05/20 01:17

コメントありがとうございます。 はい、take()でいくつやっても、ランダムでいくつかピックアップしているような動作ですね。 一度変数に格納してfinalで指定しているので実行時に変数が確定すると考えられますが、内部的な実装としては、相対参照のような形でaのメモリだけ割り当てられて、実際の値はその後に違うところをランダムに参照しに行っているのか・・・とても不思議な挙動です。 さて、本題にコメントがもらえず申し訳ないのですが()が何者かご存知でしょうか? void main(){ final list = ("a","b");//line 5 • Expected to find ')'. print(list); } こんな感じで記述してもエラーになるくせに void main(){ final a = generateWordPairs().take(5); print(a);//(ringdrop, slightmove, furwall, steepwage, oldplane) } な感じで、どんな型かもわからずに出力され、addAll()できてしまうということで混乱しております。 重ねて申し訳ございません。
mako_0221

2022/05/20 01:51 編集

コメントありがとうございます。ちょうど、近い内容を拝見しておりました。すごく的外れな考えであれば申し訳ございません。 Dartで言えば、Map/Set/Listもそれぞれiterableクラスから派生しているものとお見受けします。ただ、それぞれ継承しているもののリテラルとしては{}であったり[]であったり決まった形で記述しますし、その型で返してくれる場合も同様かとおもいっています。 現に、以下のprint(iterable);の出力結果は、[1, 2, 3]であり、(1,2,3)では当然ありません。 void main(){ Iterable<int> iterable = [1, 2, 3]; print(iterable); } これを前提に下記のドキュメントを見ても、()で記述するリテラルや()の形で戻り値を返してくる旨の内容を見つけることができません。 https://dart.dev/codelabs/iterables https://api.dart.dev/stable/2.17.1/dart-core/Iterable-class.html ※stackoverflowの記事では、確かに静的メソッドのような形で print(Iterable.generate(2, (i) => i)); // (0,1) の形で返してくれるようですが、記事内にあるように" there are no syntax in Dart to create an Iterable object."というリテラルがないというのが実態なのでしょうか?その旨も上記のドキュメントでは見つけることはできないのですが、それが事実であればそのように受け入れます。
guest

回答1

0

ベストアンサー

出力される文字列の()、[]はWordPairとは関係なありません。
出力対象がIterableListかの違いです。

この関数はIterableを返しています。
IterabletoString()すると、前後に()が付くというのが仕様のようです。
Iterable.toStringの仕様

print(a)print(a.toString())と同義です。
なので、両方とも前後に()が付きます。

addAllaで取得した文字列群をListに追加しています。
List.toString()は前後に[]が付きます。なのでprint(list)には前後に[]が付いてます。

「※なぜ」の部分。
もともとIterableを返すものでまた内部で出力順序を保持しているようではなく、Randomly generatesとヘルプに書かれているので、毎回異なる値になるのはそういう仕様になるということだと思います。
これに関して理解を深めるには、実装側を見るのもそうですが、Synchronous generatorについても知っておいた方が良いと思います。

投稿2022/05/20 01:42

ta.fu

総合スコア1667

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

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

mako_0221

2022/05/20 05:41

ありがとうございます。 IterableもListもtoString()の仕様について、確認ができました。 また、以下のような仕様があることも初めて知り、確認することができました。 The default representation always contains the first three elements. If there are less than a hundred elements in the iterable, it also contains the last two elements. If the resulting string isn't above 80 characters, more elements are included from the start of the iterable. 自分でIterableを作ることができないのは、上記のstackoverflowの記載のようにそんなSyntaxはないよということで理解するようにします。*実際に必要にかられる機会もないということなのかもしれませんが。 final a = (1,2,3) //こんな構文またはリテラルなんてない final a = (1) // 因みにこれはOKでしたが、Iterableクラスのインスタンスではないと思われる >Synchronous generator こちらについては、GeneratorにはSynchronous generator/Asynchronous generatorという考え方があり記法について知ることができました。実装の細かい部分はすぐに発見し理解に至ることは容易ではないと感じたため、少しづつ経験を積みながら学び、またここに戻って来たいとおもいます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問