[#3587] Multiple assignment at yield() — Shin-ichro Hara <sinara@...>

原です。

86 messages 1998/11/17
[#3588] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/17

まつもと ゆきひろです

[#3589] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/17

原です。

[#3590] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/17

まつもと ゆきひろです

[#3594] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/18

原です。

[#3595] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/18

まつもと ゆきひろです

[#3596] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/18

原です。

[#3598] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/19

まつもと ゆきひろです

[#3600] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/20

原です。

[#3610] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/20

原です。

[#3611] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/20

まつもと ゆきひろです

[#3622] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/21

原です。

[#3630] Re: Multiple assignment at yield() — shugo@... (MAEDA Shugo) 1998/11/22

前田です。

[#3635] Re: Multiple assignment at yield() — Shin-ichiro Hara <sinara@...> 1998/11/23

原です。

[#3658] Re: Multiple assignment at yield() — matz@... (Yukihiro Matsumoto) 1998/11/24

まつもと ゆきひろです

[#3660] Re: Multiple assignment at yield() — Shin-ichro Hara <sinara@...> 1998/11/24

原です。

[#3722] multiple assignment, yield and return — Shin-ichro Hara <sinara@...> 1998/12/01

原です。

[#3724] Re: multiple assignment, yield and return — Shin-ichro Hara <sinara@...> 1998/12/01

原です。

[#3742] List() — Shin-ichro Hara <sinara@...> 1998/12/04

原です。

[#3743] Re: List() — shugo@... (MAEDA Shugo) 1998/12/06

前田です。

[#3744] Re: List() — Shin-ichiro Hara <sinara@...> 1998/12/06

原です。

[#3755] Re: List() — shugo@... (MAEDA Shugo) 1998/12/07

前田です。

[#3758] Re: List() — Shin-ichro Hara <sinara@...> 1998/12/07

原です。

[#3760] Re: List() — shugo@... (MAEDA Shugo) 1998/12/07

前田です。

[#3761] Re: List() — Shin-ichiro Hara <sinara@...> 1998/12/07

原です。

[#3774] Re: List() — shugo@... (MAEDA Shugo) 1998/12/08

前田です。

[#3780] Re: List() — Shin-ichiro Hara <sinara@...> 1998/12/08

原です。

[#3784] Re: List() — shugo@... (MAEDA Shugo) 1998/12/09

前田です。

[#3788] Re: List() — Shin-ichro Hara <sinara@...> 1998/12/09

原です。

[#3789] Re: List() — MAEDA Shugo <shugo@...> 1998/12/10

前田です。

[#3602] problem of Delegator — keiju@... (Keiju ISHITSUKA)

けいじゅ@日本ラショナルソフトウェアです.

17 messages 1998/11/20
[#3605] Re: problem of Delegator — matz@... (Yukihiro Matsumoto) 1998/11/20

まつもと ゆきひろです

[#3606] Re: problem of Delegator — keiju@... (石塚圭樹 ) 1998/11/20

けいじゅ@日本ラショナルソフトウェアです.

[#3607] Re: problem of Delegator — matz@... (Yukihiro Matsumoto) 1998/11/20

まつもと ゆきひろです

[#3612] Re: problem of Delegator — keiju@... (石塚圭樹 ) 1998/11/20

けいじゅ@日本ラショナルソフトウェアです.

[#3613] Re: problem of Delegator — matz@... (Yukihiro Matsumoto) 1998/11/20

まつもと ゆきひろです

[#3626] block local variable (Re: スコープの範囲) — shugo@... (MAEDA Shugo)

前田です。

47 messages 1998/11/22
[#3628] Re: block local variable (Re: スコープの範囲) — Koji Arai <JCA02266@...> 1998/11/22

新井です。

[#3629] Re: block local variable (Re: スコープの範囲) — shugo@... (MAEDA Shugo) 1998/11/22

前田です。

[#3632] Re: block local variable (Re: スコープの範囲) — Koji Arai <JCA02266@...> 1998/11/22

新井です。

[#3633] Re: block local variable (Re: スコープの範囲) — shugo@... (MAEDA Shugo) 1998/11/22

前田です。

[#3636] Re: block local variable (Re: スコープの範囲) — Shin-ichiro Hara <sinara@...> 1998/11/23

原です。

[#3642] Re: block local variable (Re: スコープの範囲) — Koji Arai <JCA02266@...> 1998/11/23

新井です。

[#3645] Re: block local variable(Re: スコープの範囲) — Shin-ichiro Hara <sinara@...> 1998/11/23

原です。

[#3674] Re: block local variable(Re: スコープの範囲) — Koji Arai <JCA02266@...> 1998/11/25

新井です。

[#3678] Re: block local variable(Re: スコープの範囲) — matz@... (Yukihiro Matsumoto) 1998/11/26

まつもと ゆきひろです

[#3681] Re: block local variable(Re: スコープの範囲) — Kazuhiro HIWADA <hiwada@...> 1998/11/26

ひわだです。

[#3682] Re: block local variable(Re: スコープの範囲) — Shin-ichro Hara <sinara@...> 1998/11/26

原です。

[#3683] Re: block local variable(Re: スコープの範囲) — matz@... (Yukihiro Matsumoto) 1998/11/26

まつもと ゆきひろです

[#3684] Re: block local variable(Re: スコープの範囲) — Shin-ichro Hara <sinara@...> 1998/11/26

原です。

[#3685] Re: block local variable(Re: スコープの範囲) — matz@... (Yukihiro Matsumoto) 1998/11/26

まつもと ゆきひろです

[#3709] ruby-1.1c9 install 中に SEGV — Koji Arai <JCA02266@...>

新井です。

18 messages 1998/11/30

[ruby-dev:3594] Re: Multiple assignment at yield()

From: Shin-ichro Hara <sinara@...>
Date: 1998-11-18 06:22:56 UTC
List: ruby-dev #3594
原です。

|まつもと ゆきひろです

|いやあ,多重代入と仮引数へのバインドを比較すると1つの仮引数
|は実は多重代入の
|
|  a, = *a
|
|に相当するわけです.ですから

なるほどそうだったのか。引数の数のチェックがあるから、、、思い
つかなかった。

実引数から仮引数の値の引渡しは、たとえ1つでも多重代入の様に行
なわれるわけですね。

#そして、単純代入は多重代入の特別な場合であると考えてはいけない
#というのも重要なポイントだ。


|で,考えられる対応は
|
|  * yieldに*がついた引数が渡され,その要素が1つだった時を特
|    別扱いし,その要素だけを渡す
|
|  * ブロックのパラメータに対する挙動を変更し(あるいは多重代
|    入の挙動も含めて変更し),xは先頭の要素を(つまり「x,」と
|    等価),*xは配列として代入するようにする
|
|というものが考えられます.他にもあるかも.
|で,後者は大げさになるので避けたいですねえ.

ふーむ。考えられるのはですね、今は

  *a = [0]  #=>  a == [0]

です。それなりに納得できますが、a == [[0]] にする手もあるわけで
すよね。

  x, *a = 1, [0]  #=>  a == [[0]]

というのを考えると。一応、私の意見としては、

  *a = [0]  #=>  a == [[0]]
  yield(*[0])  #=>  yield(0)

で一票かな。難しいなあ。


そもそも事の発端を解説しますと、enumerable なオブジェクトの
wrapper クラスを作ろうとしたんです。

  class Foo
    def initialize(e); @body = e; end

    def each0(&block); @body.each(&block); end
    def each1(&block); @body.each { |*x| block.call(*x) } end
    def each2(&block); @body.each { |x| block.call(*x) } end
    def each3; @body.each { |*x| yield(*x) } end
    def each4; @body.each { |x| yield(*x) } end
  end

  Foo.new([1]).each0 { |x| p x } #=> 1
  Foo.new([1]).each1 { |x| p x } #=> 1
  Foo.new([1]).each2 { |x| p x } #=> 1
  Foo.new([1]).each3 { |x| p x } #=> [1]
  Foo.new([1]).each4 { |x| p x } #=> 1

  Foo.new([[2]]).each0 { |x| p x } #=> [2]
  Foo.new([[2]]).each1 { |x| p x } #=> 2
  Foo.new([[2]]).each2 { |x| p x } #=> 2
  Foo.new([[2]]).each3 { |x| p x } #=> [2]
  Foo.new([[2]]).each4 { |x| p x } #=> [2]

これらの実行結果について即答できる人は多くはないと思うけど(^^;、
まあ、ruby1.1 で最適な each の定義は上の each0 ですが、一見正し
そうに見える each3 がうまく動かないのが不満だったわけです。
(意外に each4 がちゃんと動くのだった。)

何にしても、受けとったものをそのまま他に回す事ができれば満足なん
ですが、、、どうしたらいいかなあ。


||  x = 25          #=> x == 25
||  x = 25, 26      #=> x == [25, 26]
||  x = *[25, 26]   #=> x == [25, 26]
||
||たいしてうれしくないかもしれないですが、ブロックパラメータの値
||の受け渡しと consistent になって、八方丸く収まるというわけ。
|
|いや,文法が悲鳴を上げると言うデメリットがあります.^^;;;

まつもとさんの悲鳴はともかく文法の悲鳴は聞きたくないです。:-)

In This Thread