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

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

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

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

Dart

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

解決済

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

mako_0221
mako_0221

総合スコア38

Flutter

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

Dart

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

1回答

0評価

0クリップ

128閲覧

投稿2022/05/19 16:33

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

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

Dart

import 'package:flutter/material.dart'; import 'package:english_words/english_words.dart'; void main(){ final list = <WordPair>[]; final a = generateWordPairs().take(1); print(a);//(tentmail) print(a.toString());//(lacktip) list.addAll(a); print(list);//[fastcamp] }

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

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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."というリテラルがないというのが実態なのでしょうか?その旨も上記のドキュメントでは見つけることはできないのですが、それが事実であればそのように受け入れます。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Flutter

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

Dart

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