読者です 読者をやめる 読者になる 読者になる

inohilog

/var/log/inohiro

日記

  • 先週はほとんど駄目な感じだった.時間がないのに…
  • 週末は大学の学園祭,グッドデザイン賞の展示,さらに都内で打合せ
  • 学園祭
    • 在学中の学園祭はこれで最後(の予定)なので,ちょっとだけ感慨深かった.一度だけ,二年生の時に出店側をやったのを思い出した
    • 今年は二学期制へ移行のため,これまで三日間あったのが前夜祭+メイン2日という構成になっていた.前夜祭(初日)は15時から,限定された場所だけ,さらに天気も悪かったためなんだか残念に感じた
  • グッドデザイン賞の展示
    • 最終日とあってか(実際はそうでもないらしい),かなり人が多かった
    • デザイナとして名前が載ってうれしい ;)
    • 感想はまた追記する



  • 2013/11/07
    • ゼミが二つあり,その後晩ご飯を食べてから研究室で作業
    • 引き続き,LINQC#)をちょっとだけ書いているが,拡張メソッド(標準クエリ演算子)で書くほうがやっぱり好きだ
      • クエリ式は順序が不自然なのと,スペースがあまり好きでない(メソッドチェインの方が好き)
      • 数年間 ruby べったりだったのも影響していると思う
using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;

namespace linqenumeratetrial
{
	public static class Extensions
	{
		public static void Times( this int count, Action action ) { for (int i = 0; i < count; i++) { action (); } }
		public static void Times( this int count, Action<int> action ) { for (int i = 0; i < count; i++) { action (i); } }
	}

	class MainClass
	{
		public static void Main (string[] args)
		{
			var numbers = new List<int> ();
			5.Times (() => {
				5.Times (() => Console.WriteLine ("Hello, World"));
				5.Times (i => numbers.Add (i));
			});

			numbers.ForEach (i => Console.WriteLine (i.ToString ()));
			Console.ReadKey ();
		}
	}
}



  • collection の数を増やすメソッドを,ForEach,foreach の双方の中から呼び出してみた
public static void increseListSize( List<int> numbers ) {
	numbers.Add (100);
}
  • List.ForEach
var numbers = new List<int> ();
5.Times (i => numbers.Add (i));
numbers.ForEach ( num => increseListSize( numbers ) );

=> 無限ループになってメモリを食いつぶし,System.OutOfMemoryException


  • foreach
var numbers = new List<int> ();
5.Times (i => numbers.Add (i));
foreach (var num in numbers) { increseListSize (numbers); }

=> collection への変更を検知して,System.InvalidOperationException
(これは過去にも遭遇したことがある.C# 5.0 以降はこのメッセージが出なくなる(?))

  • 私のC#の知識は3.0(LINQの導入)で止まっているので,4,0, 5.0の知識も得たい



  • 追記: じゃあ ruby だとどうなるのか気になったのでやってみた
  • Array#each
irb(main):001:0> hoge = %w( 1 2 3 4 5 6 )
=> ["1", "2", "3", "4", "5", "6"]
irb(main):002:0> hoge.each { p hoge; hoge << 1 }
["1", "2", "3", "4", "5", "6", 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
# 無限ループ
  • Array#size#times にしてみる
irb(main):001:0> hoge = %w( 1 2 3 4 5 6 )
=> ["1", "2", "3", "4", "5", "6"]
irb(main):002:0> hoge.size.times { p hoge; hoge << 1 }
["1", "2", "3", "4", "5", "6"]
["1", "2", "3", "4", "5", "6", 1]
["1", "2", "3", "4", "5", "6", 1, 1]
["1", "2", "3", "4", "5", "6", 1, 1, 1]
["1", "2", "3", "4", "5", "6", 1, 1, 1, 1]
["1", "2", "3", "4", "5", "6", 1, 1, 1, 1, 1]
=> 6

Array#size で取得した値はコレクションの変更に影響されないようだ

  • for
irb(main):001:0> hoge = %w( 1 2 3 4 5 6 )
=> ["1", "2", "3", "4", "5", "6"]
irb(main):088:0> for h in hoge { p hoge; hoge << 1 } #=> なぜか無視される.do-endしか使えないかな?
irb(main):089:0> for h in hoge do p hoge; hoge << 1 end
["1", "2", "3", "4", "5", "6", 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
# 無限ループ
  • こんなことしていないで研究に集中するべきだし,今はとっとと寝るべき...