アプリ版:「スタンプのみでお礼する」機能のリリースについて

初心者です。
教えてください。
下記のサンプルプログラムがあるのですが、
dataにどこでsampleという文字が代入されているのでしょうか?

StringReader sr = new StringReader("samle");
char [] data = new char[1];
while (sr.read(data) ! = -1) {
System.out.println(data);
}

結果が以下の通り表示されます。
s
a
m
p
l
e

質問者からの補足コメント

  • ありがとうございます。srの参照文字列が2行目のdataにどう入るのかイメージできません。
    2行目はあくまでも配列の箱を用意しているだけに考えてしまうのですが。

    No.1の回答に寄せられた補足コメントです。 補足日時:2022/01/15 14:32

A 回答 (5件)

一般的に関数を実行する際は、引数は読み込むだけで更新されません。

これは数学概念の関数に近い挙動です。
例)
結果 = 関数(引数) ← 結果だけが更新され、引数はそのまま

ですが関数の中で各種オブジェクトを「操作」することにより、結果以外も更新してしまう関数の「副作用」を起こすことが可能です。

ご提示の処理の場合ですと、
read 関数は引数として指定した配列オブジェクトを、
読み込んだ値を格納するための出力バッファとして「操作」し、
配列の長さ分の文字が格納されるという「副作用」がおきています。

様々な理由により、この様な直観的でない API は多々ありますので、
関数を使用する際は Javadoc の確認を怠らないようにしましょう。
    • good
    • 0
この回答へのお礼

ありがとうございました。
理解できました。

お礼日時:2022/01/17 15:44

> readはsbの中身をreadするのでしょうか?


> 引数のデータをreadするのではなく。
>そうするとcharのdataはどういう引数になるのでしょうか?
> 配列の箱だけのような気がするのですが。

StringReaderなのですからそうです。
read()した結果が引数指定した変数に格納されます。
つまり、read()結果を1文字ずつ受け取る箱(ここではdata)を、予め定義しておき、read()によってその箱に値を受け取っていることになります。
https://docs.oracle.com/javase/jp/8/docs/api/jav …

引数からして、継承元のReader::read(char[]) を利用していますね。
https://docs.oracle.com/javase/jp/8/docs/api/jav …


https://paiza.io/projects/vDM8MKOs4vrFEBAAF8f4mw
dataを定義しているchar[]の配列数をいじると動きが分かると思います。
配列数を2とかにすると、読込文字数に満たない分は、直前で読み込まれた文字がそのまま出てきます。
    • good
    • 0
この回答へのお礼

分かりやすくご説明いただきありがとうございました。

お礼日時:2022/01/17 15:43

3行目で参照渡しされてる引数dataに結果が入るでしょう。

    • good
    • 0

> dataにどこでsampleという文字が代入されているのでしょうか?



どこででも代入されてないんじゃない?
    • good
    • 0

read()で、引き数に指定したバッファ領域、ここではdataですが、dataに文字が入ります。

この回答への補足あり
    • good
    • 0
この回答へのお礼

ありがとうございます。そもそも解って無くて申し訳ないのですがreadはsbの中身をreadするのでしょうか?引数のデータをreadするのではなく。そうするとcharのdataはどういう引数になるのでしょうか?配列の箱だけのような気がするのですが。

お礼日時:2022/01/16 11:24

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!