[#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:3598] Re: Multiple assignment at yield()

From: matz@... (Yukihiro Matsumoto)
Date: 1998-11-19 06:51:34 UTC
List: ruby-dev #3598
まつもと ゆきひろです

親知らず抜いて来ました.痛かったです.(;_;)

In message "[ruby-dev:3596] Re: Multiple assignment at yield()"
    on 98/11/18, Shin-ichro Hara <sinara@blade.nagaokaut.ac.jp> writes:

|原です。

|なーるほど。まず右辺は配列になるわけですね。私は次のように
|リスト(=カンマで区切られた式)を中心に考えていたんです。
|(もちろんリストって現実には配列で表現されるんでしょうが。)
|
|  (1L) 右辺が配列ならリスト化,そうでなければそのまま
|
|  (2L) 先頭に * が付いた変数には代入しなかった残りが配列とし
|       て代入される

とすると(1L)により,右辺がリストでなく,結果が配列でない時に
は,そのまま左辺に代入されるんですね.その場合,以下の代入は
どうふるまうべきですか?

        a, b = 5
        a, *b = 5
        *a = 5

つまり,配列でないものを多重代入する時の振る舞いという意味で
すが.

私自身の解釈としては(既に述べましたが),

  * 多重代入の右辺は配列化される

  * 先頭に * が付いた変数には代入しなかった残りが配列として
    代入される

と思っています.つまり,*a = x と a = x の違いは右辺が配列化
されるかどうかにあると思っているわけです.

||上記の変更を施したruby 1.1dの挙動は以下の通りです.

これなんですが,ちょっとまずい点があったので,修正しました.
まとめると9通りの組合せがあるわけです.

  0 - block引数: &block
  1 - block引数: {|*x| block.call(*x)}
  2 - block引数: {|*x| block.call(x)}
  3 - block引数: {|x| block.call(*x)}
  4 - block引数: {|x| block.call(x)}
  5 - 暗黙block: { |*x| yield(*x) }
  6 - 暗黙block: { |*x| yield(x) }
  7 - 暗黙block: { |x| yield(*x) }
  8 - 暗黙block: { |x| yield(x) }

で,これを実行して試してみましょう.


  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(&block); @body.each { |x| block.call(*x) } end
    def each4(&block); @body.each { |x| block.call(x) } end
    def each5; @body.each { |*x| yield(*x) } end
    def each6; @body.each { |*x| yield(x) } end
    def each7; @body.each { |x| yield(*x) } end
    def each8; @body.each { |x| yield(x) } end
  end

  Foo.new([0]).each0 { |x| p x } #=> 0
  Foo.new([1]).each1 { |x| p x } #=> 1
  Foo.new([2]).each2 { |x| p x } #=> [2]
  Foo.new([3]).each3 { |x| p x } #=> 3
  Foo.new([4]).each4 { |x| p x } #=> 4
  Foo.new([5]).each5 { |x| p x } #=> [5]
  Foo.new([6]).each6 { |x| p x } #=> [6]
  Foo.new([7]).each7 { |x| p x } #=> [7]
  Foo.new([8]).each8 { |x| p x } #=> 8

  Foo.new([[0]]).each0 { |x| p x } #=> [0]
  Foo.new([[1]]).each1 { |x| p x } #=> 1
  Foo.new([[2]]).each2 { |x| p x } #=> [2]
  Foo.new([[3]]).each3 { |x| p x } #=> 3
  Foo.new([[4]]).each4 { |x| p x } #=> [4]
  Foo.new([[5]]).each5 { |x| p x } #=> [5]
  Foo.new([[6]]).each6 { |x| p x } #=> [6]
  Foo.new([[7]]).each7 { |x| p x } #=> [7]
  Foo.new([[8]]).each8 { |x| p x } #=> [8]

これで「変じゃない」挙動を定義できたと思います.

ただ,原さんの定義による挙動の方がよりよいことが示されれば,
変更するのは可能だと思います.鍵は *a という左辺を持つ多重代
入の解釈かな?
                                まつもと ゆきひろ /:|)

In This Thread