「def」を含む日記 RSS

はてなキーワード: defとは

2018-02-20

PHPJavaScriptのfunctionはタイピングしづらくて糞!

javaScriptPHP関数呼び出しの予約語

function という冗長単語なのはなぜだろうか?

タイプやすいし、書くのがめんどくさい。誰か止める人はいなかったのだろうか?

rubypythondefだし、 最近言語である goswift は func というように書きやすいのに。

C言語javaはこれは関数ですと明示的に示す予約語存在しないから、可読性をあげるために function という長い予約語を導入したということだろうか?

その辺の歴史的経緯が知りたいものである

2018-02-04

anond:20180204033435

def your_life():

..while you.live():

....you.work_for_money()

....you.age += 1

def my_life():

..me.get_my_wife(wife=beautiful)

..while me.live():

....me.status = HAPPY

....me.age += 1

2018-02-02

amazon商品レビューの星が出品者によって操作されていた件

先日、スマホ用の保護フィルムを買ったんだけど、とんでもない粗悪品が届いた。粗悪品という表現も本当の粗悪品に申し訳ないんじゃないかってくらい酷い物が。


その届いたものってのが、開口部に合わせて貼り付けても画面の上下左右それぞれ3~5mm以上がカバーできておらず、更に貼ったフィルム自体上下左右3㎜~5mm位浮いてる状態。酷い不格好だし隙間はホコリを吸い寄せるんで汚らしい。

当然星1つでレビュー投稿したら、「(製品名)用に開発されたとはとても思えない」って別のレビュー投稿されてた。

それ見たらなるほど、と思った。

かにこれ、別製品用の物を流用したってのが真相なら納得がいく。そのくらいこんな製品有り得るか?って思うものだった。


その状態で数日経った今日自分購入履歴リンクを踏んでも「ページが存在しません」となる事に気付いた。

不思議に思って今度は販売元のリンクを辿ったら、販売元名を少し変化させて(例:[abc def]から[abc])全く同じ物を再出品してるのを見つけた。

当然レビューはまだない。で何故かレビューがいっこも無いのに星5つ状態で「10件のカスタマーレビュー」の表示が(リンク先は当然何も無し)。


非常に強い悪意を感じたので、amazonには既に報告済み。

出品者の住所には、CNの表記が。

最近じゃ日本会社倫理観も酷いもんで、CNだから悪いって訳じゃないんだろうけどね。




で、ゴミを掴まされた、無駄な買い物をしたって投稿は幾つかあったんだけど、それらは放置しておいて、今回何故ここまでの事をしたのか不思議に思って少し考えてみた。


多分、今回のレビューに「返品します」って一文があった事が、販売元にとって許し難かったんじゃないかと思ってる。

だとすると、


返品できる事がわかると困る=泣き寝入りする層には売り付けてしまおう


っていう魂胆が透けて見えるような気がして仕方ない。この予想が正しいかどうかはわからないけど。


amazonがキチンと対応する事が一番良いんだけど、イタチごっこで難しそう。

要は何を言いたいかっていうと、皆も気を付けて。

2018-01-27

まだfoo, bar, bazで疲弊してるの?

abc, def, ghi, ... でいいじゃん

2017-11-18

DJ TA-SHI「1992 MIX」- HIPHOP専門ラジオ局WREP 2017年11月18日放送

01. Gang Starr - Ex-Girl To Next Girl

02. Ill Al Skratch – Where My Homiez? (Come Around My Way)

03. Black Moon - I Gotcha Opin

04. The Pharcyde - Passin' Me By

05. Common - Breaker 1/9 (Beatnuts Remix)

06. HI-C - Sitting In The Park

07. Kool G Rap & DJ Polo - ill Street Blues

08. Black Sheep - Similak Child

09. Gang Starr - Gotta Get Over

10. Redman - Tonight's Da Night

11. Spice 1 - In My Neighborhood

12. The Pharcyde - Ya Mama

13. Arrested Development - People Everyday

14. Chubb Rock - Yabadabadoo

15. Das EFX - Mic Checka

16. Das EFX - Real Hip Hop (Pete Rock Remix)

17. ED O.G & Da Bulldogs - I Got To Have It

18. Nas - Halftime

19. Public Enemy - Shut Em Down

20. Eazy-E - Only If You Want It

21. 欠番https://twitter.com/WrepRadio/status/931818391764996098

22. Onyx - Throw Ya Gunz

23. Boogie Down Production - We In There

24. Dr. Dre & Snoop Dogg - Deep Cover

25. Leon Haywood - I Want'a Do Something Freaky To You

26. Dr. Dre - Nuthin' But A G Thang

27. Scraface - A Minutes To Prey

28. Brand New Heavies - Heavy Rhyme Experience Theme

29. Heavy D & The Boyz - Blue Funk

30. Above The Law - Call It What U Want

31. Digable Planets - Rebirth of Slick (Cool Like Dat)

32. Gang Starr - Take It Personal

33. 欠番https://twitter.com/WrepRadio/status/931822759562244096

34. Kool G Rap & DJ Polo - On The Run

35. Super Cat - Ghetto Red Hot

36. LB's - Bi*** Get A Job

37. Lords Of The Underground - Check It

38. Naughty By Nature - Hip Hop Hooray

39. Eric B. & Rakim - Paid In Full (Derek B's Urban Respray Version)

40. P.M Dawn - Set Adrift On Memory Bliss

41. Wrecks-N-Effect - Wreckx Shop (Full Crew Mix)

42. A Tribe Called Quest - Hot Sex

43. Main Source - Fakin The Funk

44. Zhiggie - Rankin' In The Dough

45. RUN DMC - Here We Go

46. A Tribe Called Quest - Scenario

47. Black Sheep - The Choice Is Yours

48. Naughty By Nature - Uptown Anthem

49. Wrecks-N-Effect - Rump Shaker (Remix)

50. Kris Kross - Jump (Supercat Mix)

51. M.C Breed & DFC - Ain't No Future In Yo' Frontin'

52. MC Serch - Back To The Grill

53. Pete Rock & C.L. Smooth – They Reminisce Over You

54. Tom Scott and The California Dreamers - Today

55. Mary J. Blige feat. C.L. Smooth - Reminisce (Bad Boy Remix)

56. Positive K - I Got A Man

57. Young Black Teenagers - Tap The Bottle

58. ArtOfficial - Don't Sweat The Technique

59. Def Jef - Cali's All That

60. EPMD - Cross Over

61. Redman - Time 4 Sum Aksion

62. House Of Pain - Jump Around

63. Wrecks-N-Effect - New Jack Swing

64. MC Lyte - Ice Cream

65. Tammy Lucas & Teddy Riley - Is It Good You

66. TLC - What About Your Friends

67. Bobby Brown - Humpin' Around

68. R. Kelly & Public Announcement - She's Got That Vibe

69. Nice & Smooth - Somethimes I Rhyme Slow

70. Jeff Redd - You Called And Told Me

71. Shinehead - Try My Love

72. Kris Kross - Warm It Up

73. Naughty By Nature - Everything's Gonna Be Alright

74. Ice Cube - Check Yo Self (feat. Das EFX)

---

上記の出所は WREP‏ @WrepRadio の https://twitter.com/WrepRadio/status/931810971282059265 から https://twitter.com/WrepRadio/status/931836391440506880 までの一連のツイートより転載

2017-07-16

エディタで使いたいんですが、rubyrails辞書ファイル定番ってありますか?

自分抽出しようと思って単純に def キーワードgrep しようと思ったら privateメソッドも含まれてきてしまうのでダメそうです。

2017-06-27

ファイナルファンタジータクティクス』で召喚できる(新)本格作家

本気でかっこいいとおもってやりました。実在人物作品関係はありません。


・死屍の綾なす四ツ辻の、獅子も恐れる行く人の、知らぬは読者ばかりなり、綾辻行人ッ!

 [中範囲に防御無視ダメージダメージ量は詠唱者のHP残量に反比例)+範囲内の味方のDEFアップ]


・我が産みし死靈天上天下に及ぶものなし! 開け、聞け、探偵三道宝階ッ! 麻耶雄嵩ッ!

 [フィールドの天候がランダムに変化+各敵キャラの装備をランダムひとつ破壊(防具や魔法による回避不可)]


・私の城は美しいお城、私の頭文字は完全なる円にして王の証ッ、死ぬまで踊れっ、舞城王太郎ッ!

 [敵全体に混乱+詠唱者のSTR大幅アップ]


・実るほど頭を垂れる稲穂かな。不燃にして不稔に非ず、エリシャの奇跡の裔と知れッ! 米澤穂信ッ!

 [味方全体のHP回復+リレイズ]


・円心に居して惑うことなし、今宵ささめくあなた挽歌、参ります円居挽ッ!

 [味方全体にヘイスト+ランダムで敵の一人に死の宣告]


・連なる城は堅固にして絢爛、三度否まず三界を紀(おさ)むッ! 連城三紀彦ッ!

 [中範囲の敵味方すべてにMPHP入れ替え]


・その桜の木は一本でした。桜の木は満開でした。咲いて撃ち抜けッ! 桜庭一樹ッ! 

 [中範囲の敵にドンムブ+ドンアク+確率で防具破壊]


コケコッコッコ……コケーッ! 似鳥鶏ッ!

 [敵全体にチキン]


・清涼のうちに流水は苔むさず、命育みメフィストフェレスの女媧とならん! 清涼 in 流水ッ!

 [敵全体に水属性の大ダメージ+サイレス]


月光遊戯、双頭の悪魔国名を端から君に聞かせよう…… 英明なる都は祝福に満ちている。今出(いまいず)る川より通るがいい――アリスト(高貴なる)アリス有栖川有栖

 [敵全体にチャーム+ポイズン+faithアップ]


異能魔術師よ、奇跡をもって正邪を糺せ! 井上真偽ッ!

 [敵全体のステータス強化と味方全体の状態異常を解除]


・月は深(み)ちた……時よ止まれ辻村深月ッ!

 [敵全体にストップ]


・ひらかせていただき光栄です。皆川博子ッ!

 [味方全体にリジェネ+リレイズ+状態異常回復]


・朝明に白む山よッ! 一なる愛を識る永遠よッ! 枕木に憂う士(さむらい)よッ! 三位全一なる二文字に集えッ! 乙一ッ!

 [対象キャラの全能力値が大アップ]


・投之於冰上

 鳥何燠之

 何馮弓挾矢

 殊能将之ッ!

 [その戦闘第一ターンから仕切り直しに]


楽園死神、その胸中に二心あり。右はくろがね、左はからかね。楽園死神、その掌中に二刀あり。左は剔(そ)るもの、右は樵(こ)るものいのち捧げよッ! 汀こるものッ!

 [敵全体にレベル3デス]


・占うッ、亜細亜の星を――島々の星は荘と出たッ! 島田荘司ッ!

 [敵味方全体のアビリティシャッフル]


・いちかはじめか、はじめかいちか。どんととびでて折るか祈るか、心は螺旋折原一ッ!  

 [敵味方全体のうちランダムで一人にデス+ランダムで一人にレイズ(気絶キャラ存在する場合のみ)]


西尾維新(ハタチ)ーーーーーッッッッッッ!!!

 [敵全体に特攻ダメージ詠唱者は戦闘から除外(死亡ではない)]


・その本は本にして本に非ず、立体にして三次元に非ず、凶器にして狂気に非ず、どすこいどすこい京極夏彦ッ!

 [中範囲の敵に大ダメージ確率でスタン+三マス後方へノック]


黄昏に発つミネルヴァの梟は最強にてよしとする。駆けぬけろッ、笠井潔ッ!

 [フィールド上の敵味方全てに確率即死(即宝箱か石になる)]

2016-06-09

はろーわーるどー

見出し

t*1つ目の見出し

本文

t+1*2つ目の見出し

本文2

属性*見出し


[カテゴリ]日記カテゴリーを設定しま


小見出し

小々見出し記法
  1. リスト
    1. リスト
    2. リスト

:定義リスト

::定義リスト

テーブル

名前個数
りんご1
みかんだいだい2


引用ブロック(blockquote)を簡単記述しま


 整形したテキストをそのまま表示します(pre) 

 整形したHTMLなどのソースをそのまま表示します(pre) 

 class Foo
   def bar'baz' # return baz
   end
 end




脚注((脚注))

====

次の見出しまでその後の日記を「続きを読む」にしま

続き1

続き2

見出し


=====

見出しも含めてその後の内容を「続きを読む」にしま

続き1

続き2

続き3

見出し



自動リンクテスト

グーグルhttps://www.google.co.jp/

2016-03-29

関数(正確にはメソッドというのですが)は、処理を1つにまとめたものです。

例えば、次のようなプログラムを書かないといけないとします。

print('Hello, world!')
print('Good morning, world!')
print('Hello, world!')
print('Good morning, world!')
print('Hello, world!')
print('Good morning, world!')

でも面倒なので関数定義します。

def my_print():
  print('Hello, world!')
  print('Good morning, world!')

my_print()
my_print()
my_print()
my_print()
my_print()

2016-01-24

Python で list から csv ファイル作成する。

python の質問になります。 - 例えばlist = [[1,あ,い,う,え,お],[2,か,き,く,... - Yahoo!知恵袋

# make csv file
import csv
def make_csv_file(table_data, file_path):
  with open(file_path, 'w') as file:
    for row_data in table_data: 
      csv.writer(file).writerow(row_data)

# usage
list = [
  ['1','a','b','c','d','e'],
  ['2','f','g','h','i','j'],
  ['3','k','l','m','n','o']
]
make_csv(list, 'sample.csv')

2015-12-08

掛け算足し算にも順番があるなら

三角形の合同の証明で、

AB=DE

BC=EF

∠BAC=∠EDF

二辺狭角により

ABC≡△DEF

みたいに書くとき対応する点同士の順番が揃ってないとバツにされるが、これに関して数学的にはどうなの?

2015-12-07

# method
def func(n):
  l = []
  for i in range(n):
    l.append({
      "name":"name"+str(i+1),
      "id":str(1300+i+1)
    })
  return l

# result
func(3)
[{'name': 'name1', 'id': '1301'}, {'name': 'name2', 'id': '1302'}, {'name': 'name3', 'id': '1303'}]

2015-12-05

仕事ばかりつかれた

仕事ばかりつかれた

どうしたもの趣味もないし


class HtmlObjs

def GetHtmlObjs(init_url, n)

obj = URLList.new

urls = obj.GetURLListAll(init_url, n)

htmls = Array.new

Anemone.crawl(urls, :depth_limit => 0) do |anemone|

anemone.on_every_page do |page|

htmls << page.doc

end

end

return htmls

end

end

class ProductInfo

def GetProductName(html)

return html.css("h1[class='product-name']").text

end

end

2015-09-05

悪質勝手登録出会い系サイトcommunity site @ dkij2.b3qzt.com

配信停止依頼しようにもドメインデタラメでたぶん単純な返信メールには応じなさそうだし、

しかも無事Webフィルタリングソフト突破できても

配信停止依頼にはこちらのメールアドレス晒しメールを送らないといけないので、晒しておきますね。

特商法ではありません

ビジネス上の公開情報

http://dkij2.b3qzt.com/special.php?special=3&s=1441443363&code=def&ssl=1441443363&ssl=1441443363

運営者》

dkij2.b3qzt.com事務局

メールアドレス

info@dkij2.b3qzt.com

ドメイン名義:Whois Privacy Protection Service by onamae.com

2015-05-09

def 明日から本気出す():
  sleep(86400)
  来週から本気出す()

def 来週から本気出す():
  sleep(604800)
  来月から本気出す()

def 来月から本気出す():
  sleep(2592000)
  本気()

def 本気():
  raise NotImplementedError()

2015-01-24

http://anond.hatelabo.jp/20150124001319

そんなもん定義できねえよ。バカだなぁ。

三角不等式なりたたんだろ。

追記

Scala元増田のやりたそうなことを書いてみた。

n次元空間にあるn次元ベクトルとそのm次元部分空間にあるm次元ベクトルとの距離。

結構大変だったじゃねーか。

もし本当にこれが解けなくて困ってたんなら2000円ぐらい払って欲しい。

type Vector = Array[(Int, Double)]

def distanceWithProjection(p1: Vector, p2: Vector): Double = {
  def distance(p1: Vector, p2: Vector) = {
    var d = 0.0
    for (i <- 0 to (p1.size - 1)) {
      val dp = p1(i)._2 - p2(i)._2
      d += dp * dp 
    }
    Math.sqrt(d)
  }

  def find(vector: Vector, i: Int): Option[(Int, Double)] = {
    val filterd = vector filter (v => v._1 == i)
    if (filterd.size == 1)
      Some(filterd.head)
    else
      None
  }

  def projection(from: Vector, to: Vector): Vector = {
    var vector = Array.fill(to.size)((0,0.0))
    for (i <- 0 to (vector.size - 1)) {
      vector(i) = find(from, to(i)._1) match {
        case Some(v) => v
        case None => (0,0.0)
      }
    }
    vector
  }

  distance(projection(p1, p2), p2)
}

2014-06-19

http://anond.hatelabo.jp/20140619010953

純粋なrandom関数は、引数に渡したseed値に対して、同じseedには必ず同じ値を返す。

一つ前の乱数を再びseedにするやり方で、いくつもの乱数純粋に取り出せるよ。

もちろん初期値が一緒なら、起動するたびに同じ答えが返るけど。

で、初期値を起動するたびに変えたいってのを純粋にやるなら、IOモナド使うことになる。

手続き系とFPどっちのが分かりやすくなるかは、ケースバイケースだから使い分けろ、ってのは正しい。

追記:

ってよく見ると、ランダム値列の作り方じゃなくて、あくまでどうやって返す関数書くか、ってことか。

それならIOモナド使うまでもないので、自分的に書きやすScalafp形式で書いてしまうけど

val rands = Seq(10,20,1,6,8,0,0,0,20,10)

def f(xs: Seq[Int]) = xs.slice(0, xs.scanLeft(0){_ + _} takeWhile {_ <= 50} size)

f(rands)

でいけると思う。

2014-03-26

教えて!Scalaちゃん

// Scala

class Base {

protected def func = {}

}

class A extends Base {

(new A).func // (A)

}

class B extends A {

(new A).func // (B)

}

class C extends Base {

(new A).func // (C)

}

// ってやると(B)(C)がエラーになる。

// (C)はまだわからないでもないが、(B)がエラーになるのがわからない。

// (たとえoverrideされてたとしても)funcの中身まで知ってるのに呼べないとか。

// うーむ。

2014-02-15

Python無名関数っぽいUnixコマンド作った。

GitHubとかブログやってないからここに書いておく。

使い方

標準入力を使いまわしたいとき

... | fun x:: cmd1 x : cmd2 x : ... : cmdn x | ...

ただしcmdにはサブシェルパイプなどは使用できない。

標準入力をそのまま利用する場合と一行毎に処理する場合

一行毎に処理する場合はxargs -Iを利用する。

$ ls *txt
a.txt b.txt
$ cat a.txt
1
$ cat b.txt
2
$ ls *txt | fun x:: echo x : cat x
a.txt b.txt
1
2
$ ls *txt | xargs -Ix fun _:: echo x : cat x
a.txt
1
b.txt
2

コード(fun)

>と<はそれぞれ大小の不等号で置き換えてくださいな

#!/usr/bin/env python
import sys
from subprocess import *

def take_variable(var):
	# check the syntax of variable (http://www.gnu.org/software/bash/manual/bash.html)
	# variable ::= (_|[A-z])(_|[A-z]|[0-9])*
	# variable contained space
	if len(var.split()) > 1:
		raise Exception('fail: the variable contained space')
	# check head
	if not (var[0].isalpha() or var[0] == '_'):
		raise Exception('fail: the variable contained wrong character')
	# check the body of variable
	b = True
	i = 0
	for c in var[1:]:
		i += 1
		# is variable contained invalid character?
		if not (c.isalpha() or c.isdigit() or c == '_'):
			b = False
			break
	# no exception if thre are only spaces after variable
	if not b and not var[i:].isspace():
		raise Exception('fail: the variable contained wrong character')
	elif b:
		return var[0]
	else:
		return var[:i]

def parse(var_to_cmds):
	# check the position of '::'
	try:
		pos = var_to_cmds.index('::')
	except Exception:
		raise Exception('not exists "::"')
	var = var_to_cmds[:pos]
	cmd_str = var_to_cmds[pos+2:]
	# check the format of variable and commands
	if var ==  '':
		raise Exception('fail: no variable before "::"')
	elif cmd_str == '':
		raise Exception('fail: no commands after "::"')

	return (take_variable(var),cmd_str)


if __name__ == '__main__':
	# parse variable and commands
	try:
		var,cmd_str = parse(' '.join(sys.argv[1:]))
	except Exception, e:
		print >>sys.stderr, e
		sys.exit(1)

	# var -> val
	val = sys.stdin.read().replace('\n',' ')
	# mapping and split by ':' again
	commands = map(
			(lambda cmd: cmd.replace(' '+var+' ',' '+val+' ')),
			cmd_str.split(':'))

	# exec command
	for cmd in commands:
		try:
			# need split for remove spaces
			check_call(cmd.split())
		except Exception,e:
			# print >>sys.stderr, e
			sys.exit(1)

本当はfunじゃなくて\(バックスラッシュ)で、:: じゃなくて→にしたかったんだけど、シェルが置き換えちゃうからしかたない

シェルの改造は禁断の手段だし

2012-11-13

Python3でMeCab

python3.2にpythonバインディングを入れようとしても途中でエラーが出る

AttributeError: 'module' object has no attribute 'split'

setup.pyの中で使われているstring.splitがpython3.2では使えなくなってるからなので以下のように変更すればおk

setup.py

def cmd2(str):
    return string.split (cmd1(str))

を以下に変更

def cmd2(str):
    return cmd1(str).split()

これでいけます。困ってる人がいたら参考にしてください。

2012-08-13

C#基礎文法最速マスター

1. 基礎
classの作成

プログラムclass記述します。たとえばSampleという名前classを作る場合、Sample.csファイル内に次のように書きます。(C#場合ファイル名とクラス名は同一でなくても良い。複数のクラスを書いても良い)

public class Sample {

}
Mainメソッドの作成

プログラムclass内のMainメソッドの先頭から実行されます。Mainメソッドは次のように書きます

public class Sample {

    public static void Main( String[] args ) {
         // 処理を書く
     }

}
Console.WriteLineメソッド

文字列を表字するメソッドです。

Console.WriteLine( "Hello world" );
コメント

コメントです。

// 一行コメント

/*
   複数行コメント
 */
変数の宣言

変数の宣言です。変数の宣言時にはデータ型を指定します。

// 変数
int num;
データ型

データ型です。C#データ型には値型と参照型とがあります。以下は値型のデータ型です。

// int(整数)型
int num;
// char(文字)型
char c;
// float(単精度浮動小数点)型
float val;
// double(倍精度浮動小数点)型
double val;
// bool(論理)型
bool flag;
// DateTime(日付)型
DateTime date;

以下は参照型のデータ型です。

// StringString s;
// 配列String[] array;
プログラムのコンパイル

プログラムコンパイルするには、コマンドラインで以下のようにします。

csc Sample.cs
プログラムの実行

プログラムを実行するには、コマンドラインで以下のようにします。

.net framework on Windows場合

Sample.exe

Mono.frameworkの場合

mono ./Sample.exe
2. 数値
数値の表現

int、float、double型の変数に数値を代入できます。int型には整数だけ代入できます。float、double型には整数でも小数でも代入できます

int i = 2;
int i = 100000000;

float num = 1.234f;

double num = 1.234;
四則演算

四則演算です。

num = 1 + 1;
num = 1 - 1;
num = 1 * 2;
num = 1 / 2;

商の求め方です。割る数と割られる数が両方とも整数場合計算結果の小数点以下が切り捨てられます

num = 1 / 2;  // 0

割る数と割られる数のどちらかが小数場合計算結果の小数点以下が切り捨てられません。

num = 1.0 / 2;    // 0.5
num = 1 / 2.0;    // 0.5
num = 1.0 / 2.0;  // 0.5

余りの求め方です。

// 余り
mod = 4 % 2
インクリメントとデクリメント

インクリメントとデクリメントです。

// インクリメント
 ++i;

// デクリメント
 --i;
3. 文字列
文字列の表現

文字列ダブルクォートで囲みます

String str = "abc";
文字列操作

各種文字列操作です。

// 結合
String join = "aaa" + "bbb";

// 分割
String[] record = "aaa,bbb,ccc".Split( "," );

// 長さ
int length = "abcdef".Length();

// 切り出し
"abcd".Substring( 0, 2 )   // abc

// 検索
int result = "abcd".IndexOf( "cd" ) // 見つかった場合はその位置、見つからなかった場合は-1が返る
4. 配列
配列変数の宣言

配列です。

// 配列の宣言
int[] array;
配列の生成

配列の生成です。配列の生成時には要素数を指定するか、初期データを指定します。

int[] array;

// 要素数を指定して配列を生成
array = new int[5];

// 初期データを指定して配列を生成
array = new int[] { 1, 2, 3 };

// 宣言と同時に配列を生成
int[] array2 = new int[5];
配列の要素の参照と代入

配列の要素の参照と代入です。

// 要素の参照
array[0]
array[1]

// 要素の代入
array[0] = 1;
array[1] = 2;
配列の要素数

配列の要素数を取得するには以下のようにします。

array_num = array.Length;
配列のコピー

配列の要素を別の配列コピーするには以下のようにします。

int[] from = new int[] { 1, 2, 3 };
int[] to = new int[5];

from.CopyTo(to, 0);
5. 制御文
if文

if文です。

if ( 条件 )
{

}
if ~ else文

if ~ else文です。

if ( 条件 )
{

}
else
{

}
if ~ else if 文

if ~ else if文です。

if ( 条件 )
{

}
else if ( 条件 )
{

}
while文

while文です。

int i = 0;
while ( i < 5 )
{
    
    // 処理
    
    ++i;
}
for文

for文です。

for ( int i = 0; i < 5; ++i )
{
    // 処理
}
for-each文

for-each文です。配列の各要素を処理できます

int[] fields = new int[] { 1, 2, 3 };

foreach (int field in fields)
{
    // 処理
}
6. メソッド

C#では関数メソッドと言いますメソッドを作るには次のようにします。戻り値を返却するにはreturn文を使います

static int sum( int num1, int num2 )
{
    int total;

    total = num1 + num2;

    return total;
}
9. ファイル入出力

ファイル入出力です。ファイル入出力を行うには、プログラムの先頭に以下を記述します。

using System.IO;

以下がファイル入力の雛形になりますファイルオープンや読み込みに失敗した場合catch節に処理が移ります

String filename = "text.txt";
StreamReader reader = null;
try
{
    reader = new StreamReader(filename);

    String line;
    while ((line = reader.ReadLine()) != null)
    {

    }

}
catch (IOException e)
{
    // エラー処理:

}
finally
{
    if (reader != null)
    {
        try
        {
            reader.Close();
        }
        catch (IOException e) { }
    }
}

またはC#ではusing ステートメントと言うものがあり、この様にも書ける

String filename = "text.txt";
using (StreamReader reader = new StreamReader(filename))
{
    try
    {

        String line;
        while ((line = reader.ReadLine()) != null)
        {
            // 読み込んだ行を処理
        }

    }
    catch (IOException e)
    {
        // エラー処理:

    }
}

usingをつかうとCloseがなくなったことからわかるようにusing(){}を抜けるとき自動的にDisposeメソッドを呼び出し、オブジェクトを廃棄する。その分コードスッキリするが、使いにくい場面もあるので考えて使うこと。

以下がファイル出力の雛形になりますファイルオープンや書き込みに失敗した場合catch節に処理が移ります

String filename = "text.txt";
StreamWriter writer = null;

try
{
    writer = new StreamWriter(filename));

    writer.WriteLine("abc");
    writer.WriteLine("def");
    writer.WriteLine("fgh");

}
catch (IOException e)
{
    // エラー処理:

}
finally
{
    if (writer != null)
    {
        writer.Close();
    }
}

こちらもusingを使って書ける。が、割愛する。

知っておいたほうがよい文法

C#でよく出てくる知っておいたほうがよい文法の一覧です。

繰り返し文の途中で抜ける

繰り返し文の途中で抜けるにはbreak文を使用します。

for ( i = 0; i < 5; ++i ) {

    if ( 条件 ) {
        break;    // 条件を満たす場合、for文を抜ける。
    }

}
繰り返しの残り部分の処理をスキップする

残りの部分処理をスキップし、次の繰り返しに進むにはcontinue文を使用します。

for ( i = 0; i < 5; ++i ) {

    if ( 条件 ) {
        continue;    // 条件を満たす場合、残りの部分処理をスキップし、次の繰り返しに進む。
    }

}
例外処理

例外を投げるにはthrow文を使用します。

throw new Exception( "Error messsage" );

例外処理をするにはtrycatch文を使用します。

try {

    // 例外が発生する可能性のある処理

} catch ( Exception e ) {

    // 例外発生時の処理

}

2012-07-30

def current_method_name; begin raise; rescue Exception => e; $@[1] =~ /`(.*)'/; $1 end end

2012-01-18

Python vs Ruby vs PHP vs Haskell プログラミング言語バトル part1

 

42 : デフォルト名無しさん : 2011/11/12(土) 23:53:51.20

Pythonの方が弄れる対象が多いのに、なんでウェブ系だとPHPの方が流行ってんだろ

端末からテキスト処理も楽だし、数値計算周りのライブラリも充実しているのに

PHPが優遇されているのって歴史的な経緯以外に何か他の理由でもあるのか?

けどまぁ、情弱文系SEが大半を占めているバカだらけの日本じゃ別にPHPで困ることもないか

45 : デフォルト名無しさん : 2011/11/13(日) 01:41:24.25

数値計算や端末からテキスト処理なんてWeb系じゃ大して使わないからなあ…

43 : デフォルト名無しさん : 2011/11/13(日) 00:04:23.30

PHPが未だに現役なのは、単に歴史的な経緯でしかないだろ

Pythonに関しては、ZopeさえコケていなければWebサーバLLとして大成功していたはずなのに、

Railsなんかが登場したおかげで、すっかり影が薄くなってしまますた....

44 : デフォルト名無しさん : 2011/11/13(日) 00:49:55.28

zopeってコケてたんだ

ってか、railsインスパイアされたフレームワークって今じゃ幾らでもあるよね

djangoとかCakePHPとか。rubyってRoRを使いたいユーザを除くと、

pythonPHPの方がユーザー数は圧倒的に多いと思うんだけど

本家railsって、他を遥かに越えるほど良いものなんだっけ?

48 : デフォルト名無しさん : 2011/11/13(日) 08:30:25.68

44

Zopeが登場した当時、RDB+PHPはもう古い、これからOODB+ZopeWebの中軸になる!」

さかんに宣伝され、雑誌でもZope特集が組まれていた

 

少なくとも自分ZopeからPythonという言語を知ったし、その時点でRubyは知らなかった

そして、その後のORM(RDB)+Railsの出現と華々しい革新性への注目は、誰もが知っているだろう

今でもZopeの開発は継続されてはいるが、結果的に当初の期待が大きく裏切られたという事実は動かしがたい

 

djangoCakePHPについては実際に触っていないので憶測になるが、おそらく技術水準ではRailsと同等だろう

しかしRailsはRailsコミュニティの活動が活発だし、その進化は異常に早い

 

Railsに何か致命的なトラブルが発生して開発が停滞する、あるいはdjangoCakePHPから

何かのイノベーションが提示されでもされない限り、後発のdjangoCakePHPRailsに追いつくのは無理

Railsは決して技術的に完璧Webフレームワークではないんだけどね....(たとえばSeaSideのような.... )

 

からこそ「もしもZopeが....だったなら」という「たら・れば」感はPythonコミュニティの潜在認識になっている

51 : デフォルト名無しさん : 2011/11/13(日) 12:55:40.83

 C a k e P H P は う ん こ   

遅い、設計が古い、動作がおかしいの3重苦

日本では流行ってないけど海外だとYiiが流行ってきてる

55 : デフォルト名無しさん : 2011/11/13(日) 17:31:12.14

CakePHP使ってんの?

可哀そうにw

53 : デフォルト名無しさん : 2011/11/13(日) 14:44:48.55

求人PHPばかりだからPHPやるしかないだろ。

57 : デフォルト名無しさん : 2011/11/13(日) 19:34:04.95

でもやっぱりいつもの使い慣れたLL(Python/Ruby)で

Webサービスを書きたいってのがある

73 : デフォルト名無しさん : 2011/11/15(火) 17:32:46.07

アメリカ言語ユーザー数は

Python>>>>>>>>Ruby

求人数は

Ruby on Rails>>>>>>>>Django

http://www.indeed.com/jobtrends?q=django%2Cruby+on+rails&l=

どういうことなの?

74 : デフォルト名無しさん : 2011/11/15(火) 17:48:15.59

RubyRails以外に使い道がないか

75 : デフォルト名無しさん : 2011/11/15(火) 17:54:35.50

海外ではRubyは昨今のRailsバブルのお陰で

もはやWebスタートアップ共通語になってるらしいからね

求人数が多いのはそのためだと思うよ

76 : デフォルト名無しさん : 2011/11/15(火) 18:03:23.05

なんかのミスかと思ったがアメリカでもRuby on Railsは人気があるのかなあ・・・

Pythonのほうが使いやすいと思うのだがフレームワークRailsが優位なんだろうか

77 : デフォルト名無しさん : 2011/11/15(火) 18:23:14.33

Djangoは周辺ライブラリ微妙だし本体も鈍くさい感じがする。

でも、FlaskはSinatraより好きだからPythonが嫌いってわけではない。むしろ好き。

 

ただ、いざ作り始めるとやっぱりRailsが楽だなあってなって、Railsを使い続けている。

78 : デフォルト名無しさん : 2011/11/15(火) 18:38:46.28

同感だ

同じように思っている人が他にもいて安心した

79 : デフォルト名無しさん : 2011/11/15(火) 18:54:37.13

PHPJavaScalaには

Railsみたいなフレームワークあるのに

Pythonはいいのないんだよな

80 : デフォルト名無しさん : 2011/11/15(火) 21:19:09.89

PHPフレームワークが乱立しすぎているから、RailsPHPで実装してみようというやつが出てきた。

Scalaも注目されだしたのはつい最近のことだしな。

それに比べてPythonは、Zopeというデファクトスタンダードが既に存在していたけど、

つの間にかフェードアウト

ただ、どうやってもRailsもどきRailsを超えることはできないのは間違いない。

83 : デフォルト名無しさん : 2011/11/15(火) 21:25:38.55

パクリオリジナルを超えられない(キリッ って定型句だけど、

これってキリッって言いたいだけだと思う。

後発品が先に出たものを超えたものなんていくらでもあるから

84 : デフォルト名無しさん : 2011/11/15(火) 21:30:04.39

D言語って超えたって?

85 : デフォルト名無しさん : 2011/11/15(火) 21:31:12.00

B言語って超えたって?

86 : デフォルト名無しさん : 2011/11/15(火) 21:53:33.76

でもRailsRubyの黒魔術を使いまくりから

PHPで同じ事をできないわけではないだろうけど、Ruby on Railsほど簡潔にはできない

90 : デフォルト名無しさん : 2011/11/15(火) 22:50:07.81

スタートアップなんて根無し草の集まりにとって、

googleが囲った言語coolさを見出せないんだろ

123 : デフォルト名無しさん : 2011/11/20(日) 11:32:16.79

まあくだらねえWEBサービス作って喜んでる情弱は早く死ねって事だよ

91 : デフォルト名無しさん : 2011/11/15(火) 22:52:42.98

そういう理由じゃなくてRailsのほうが単純に情報プラグインも多いからでしょ

3 : デフォルト名無しさん : 2011/11/15(火) 23:07:07.67

linuxじゃデフォのツールなんだし、ツールとの連携を考えたらpython一択じゃん

わざわざ不合理で不完全な言語を使うなんて

社会からハミ出た奴らの精神的な作用によるものじゃないの?

95 : デフォルト名無しさん : 2011/11/15(火) 23:20:20.21

django情報プラグインが増えないという、

現実に対する鬱憤を吐いてるようにしか聞こえないな

もしも

linuxじゃデフォのツールなんだし、ツールとの連携を考えたらpython一択じゃん

真実であるのなら、今頃はdjango情報プラグインが溢れかえっているはず

104 : デフォルト名無しさん : 2011/11/16(水) 01:20:49.05

Python信者乙。

yumや、gdbgnome拡張pythonであるからといって、それをwebアプリでも使いたいと思う人は少ないというだけのこと。

ソースからインストールする必要があったとしても、web開発ではrubyを使いたいという人が多いというだけのこと。

94 : デフォルト名無しさん : 2011/11/15(火) 23:15:11.93

というか、世界中Pythonプログラマが Remeber Zope!! を合い言葉

打倒RailsたるWebフレームワークを開発しているはずだけど、

いまだにRailsを超えるプロダクトが登場しないのはナゼ?

Railsも登場してから、かなりの年月が経過しているんだけどなぁ....

その間にもRailsRails 3が登場して、REST/AJAXの強化等の進化継続しているよ

347 : デフォルト名無しさん : 2011/12/09(金) 10:16:35.22

Ruby では

ary.map {|x| x**2}

となるものが、Python では

map(lambda x: x**2, ary)

となり、lambda の本体が1つの式では表現しきれなくなると

def mapper(x):

.....

map(mapper, ary)

書き換える必要があります

348 : デフォルト名無しさん : 2011/12/09(金) 10:24:20.94

Pythonのlambdaを用いた階乗計算

f = lambda x:(x and f(x-1)*x)or 1

RubyにはPythonのように「lambda本体は式でなければならない」という限定がありませんから

andやorを使った不自然記述をしなくても

f = lambda{|x|if x == 0 then 1 else x*f.call(x-1) end}

または

f = lambda{|x|x == 0 ? 1 : x*f.call(x-1)}

と書けます。lambda内でreturnが使えますから、書きたければ

f = lambda{|x|if x == 0 then return 1 else return x*f.call(x-1) end}

でもOKです。

390 : デフォルト名無しさん : 2011/12/10(土) 15:35:41.62

348

これはPythondisっているように見せかけてRubydisっているのか? と一瞬思ってしまったw

だってRubyのほうが長くない?CLのfuncallみたいなcall()がちょっとうざいし…

そしてどっちもlambda式の中で束縛変数名前再帰可能、と

350 : デフォルト名無しさん : 2011/12/09(金) 11:12:13.28

要素に対する関数適用と、抽出を組み合わせる場合

Python

print [x*2+100 for x in [1,2,3,4,5] if x > 2 and x < 5]

暗号のように見える。

Ruby

puts [1,2,3,4,5].select{|i| i > 2 and i < 5}.map{|i| i*2+100}

思考の流れと、コードの流れが一致しているので書きやすい。

351 : デフォルト名無しさん : 2011/12/09(金) 11:22:55.04

だれだPythonなら書き方はひとつとか言ってるのは

map(lambda x: x*2+100, filter(lambda x: x > 2 and x < 5, [1,2,3,4,5]))

354 : デフォルト名無しさん : 2011/12/09(金) 12:22:07.37

pythonて可読性が高いのをうたってる割にはそこいまいちだよね

353 : デフォルト名無しさん : 2011/12/09(金) 12:10:08.46

Ruby場合には、左から右へと無名関数データフローあるいは

パイプラインのように並ぶからコードが読みやすい

 

関数型プログラミングに不慣れな初心者でも、参照透明性のあるコード自然に書ける

プログラマにとって優しい or プログラミングの楽しさを教えてくれるのがRuby

 

それと比較すると、Pythonコードは、関数型プログラミングというもの

いかに高度で難解なものであるかという事をもったいぶってプログラマ押し付け

 

もしもPythonしか知らないプログラマであれば、関数型 = 難解 という印象を持つだろう

356 : デフォルト名無しさん : 2011/12/09(金) 12:53:45.66

階乗計算くらいだと単純すぎて、ナゼ重要なのかが分かりづらいと思うのでコードで示す

result_list = source_list.map { |elem|

  x = foo(elem.x)  # ここが局所宣言を書く部分

  y = bar(elem.y)  # ここも局所宣言の続き

  x + y       # 最後に評価された式の値が、無名関数のリターン値になる

}

Rubyでは、map等に与える無名関数の中で局所的な環境(クロージャ)が作られるから

x = foo(...) のような代入文がいくつでも(= 複雑な処理でも)書ける

このポイントは、実用的なプログラム関数型風で書こうとした時に、威力を発揮する

357 : デフォルト名無しさん : 2011/12/09(金) 12:59:21.07

余計分かりづらくなった

358 : デフォルト名無しさん : 2011/12/09(金) 13:17:26.54

リスト内包表記が暗号みたいと言ってる奴は

高卒ドカタなんだろうなぁと可哀想になる

大学数学に触れる機会があれば

集合の表記に似せてることが分かるから

386 : デフォルト名無しさん : 2011/12/10(土) 01:41:34.46

数学とかで慣れてるし区切りが関数のがわかりやすい

359 : デフォルト名無しさん : 2011/12/09(金) 13:46:31.97

355

map/filterはfor/ifと同じだと言っているだけだから、難解という印象は持たない。

関数型プログラミングに慣れた、あるいは得意な人であれば、そういった印象なんだろね

Rubyの魅力はこれから関数型プログラミングを学ぼうとする初心者、 あるいはそんな初心者へ教える立場から見た、優しさ or 分かりやすさなんだ

360 : デフォルト名無しさん : 2011/12/09(金) 13:53:28.85

Rubyだと直感的に書けるコード

[1,4,3,2].sort.reverse.map{|x| x.to_s}.join('-')

Pythonだと読みにくい。

'-'.join(map(str, reversed(sorted([1,4,3,2]))))

361 : デフォルト名無しさん : 2011/12/09(金) 14:07:17.88

360

Pythonでは思考の流れと一致しないばかりか、「カッコだらけ」のコードになると.....

364 : デフォルト名無しさん : 2011/12/09(金) 14:28:55.99

カッコだらけのコードを分かりやすくする基本的な方法静的単一代入じゃないか

Rubyのやり方は基本ではなく玄人のやり方だろ

372 : 369 : 2011/12/09(金) 16:21:03.82

Pythonでは組み込みの型でメソッドチェインはやって欲しくないな

listにmap,filterメソッドができたとしても、

似たようなコレクションtuple,deque,array,queue等にも同じメソッドが必要になってくるし。

シーケンスプロトコルの利点が活かせない。

383 : デフォルト名無しさん : 2011/12/10(土) 01:17:28.39

372

外部のライブラリでも列挙可能なものは、たいていEnumerableモジュールをimportしてます

Rubyユーザーは列挙可能なものmapselectできて当然だろって思ってる気がしま

377 : デフォルト名無しさん : 2011/12/09(金) 18:41:51.79

Pythonは「何かを便利に書くためのしわ寄せ」をはっきり寄せてくる

得意と不得意を言語レベルではっきり主張するのでメリケン好みと言えなくもない

Rubyは全方位になんとなく八方美人なので、全体的になんとなく書きやすくてなんとなくキモくて遅い

379 : デフォルト名無しさん : 2011/12/09(金) 18:48:52.27

Pythonユーザー調教っぷりは異常

「書きにくいってことはその処理に向いてないってことだから諦めろ」を地で行く

387 : デフォルト名無しさん : 2011/12/10(土) 13:40:40.74

リストの内包表記はシンプルに書けるときは使うけど

基本その場でdefするのがPython風なんだと思う。

389 : デフォルト名無しさん : 2011/12/10(土) 14:40:31.04

無名関数が文を使うほど複雑なら名前を付けるのが Python 流と想像

384 : デフォルト名無しさん : 2011/12/10(土) 01:23:49.48

outer(center(inter( arg )))

これを読みづらいと感じるのは、左から右に流れる

日本語文に慣れているからだと思うが、

もしかしてアラビア語ネイティブな人からすると逆に読みやすいのか?

385 : デフォルト名無しさん : 2011/12/10(土) 01:34:57.89

なるほど、ということは右から左、左から右どっちでも行ける言語が最高ですね

F#パイプライン演算子最高ということで

2011-11-15

レインマンになった嫁と暮らす

レインマン」って映画がある。

トム・クルーズが若い頃、たしかトップガンの次の次ぐらいに出た作品で、アカデミー賞を取っている。

   △△△

主人公のチャーリー(トム)は、父の遺産相続問題をきっかけに、自分物心つく前から施設に入ってて存在すら知らなかった兄のレイモンド(ダスティン・ホフマン)と再会して、施設から無理やり連れ出してはみたものの、自閉症レイモンドが次々にやらかす奇行にすっかり参ってしまう。飛行機で移動しようと空港に行けば、「ABC航空はダメ19xx年x月x日どこどこで墜落○○人死亡。DEF航空?ノー!19xx年x月x日○○人死亡……」と百科事典のように正確な記憶力を見せて暴れ回る。

大丈夫だって飛行機はそう簡単には落ちないよ」

弟がいくら確率を持ち出して説得しても兄のパニックはおさまらない。

根負けしたチャーリーが数千キロもの行程を運転して行こうと高速に乗れば、今度はハイエイ死亡事故統計を口走って「いやだー!死ぬー!」と絶叫するレイモンド。

「どうすりゃいいんだよ!」とキレたチャーリーは、名前のない田舎道ばかりを走って西をめざすことに。野原の真ん中のうらぶれた安宿で熱いバスにでもつかろうと湯の栓をひねると、「ダメーーー!そんなことしたら赤ちゃんが!」とまたしても半狂乱に。

   △△△

映画だと、レイモンドのこの熱い湯船トラウマきっかけにして幼かった兄弟の心の触れ合いの記憶が少しずつ呼び戻され、そこからしみじみと感動的なラストに向かって物語が動いていくのだけれど、別にここでなつかし映画語りがしたかったわけじゃない。

書きたかったのは、あの日以来、俺の嫁レインマンになってしまったってことだ。

たぶん俺の嫁だけじゃない。日本中で、いや、遠く韓国中国欧州にも、突然たくさんのレインマンが生まれてしまったんだ。

   △△△

大丈夫だよ、この説明を見てみなよ」

「そうは言うけど、実際言われてるような事態にはなってないじゃん」

等々、いくら条理をつくして話し合ってもダメなのだ。

嫁は怖いのだ。

安心より、怖いという気持を選んだのだ。

から科学的にマユツバだと言われようと、自分原始的な恐怖心にフィットするものばかりに注目し、耳を傾ける。そして言う。

「ほら、ご覧なさいよ!みんなそう言ってる」

嫁がブックマークしているサイトやフォローしているツイッターの発信者名を見て、俺は失神しそうになった。

俺のTLでは、「○ン○○」だの「○ル○」だのと認定されている名前がきら星のごとく並んでいる。そう、微生物コロニーを作るみたいに、彼らはお互いに引かれ合って堅固なオピニオン集団を形成しているのだ。

嫁が俺じゃなくて○○○○や○o○の行進についていく。

マジかよ。

勘弁してくれ。

   △△△

映画チャーリーレイモンドのような取っ組み合いにはならなかったけど、来る日も来る日も絶望的な言い争いが続いた。

わが家の食卓からはいくつかの食品が完全に姿を消し、子供給食牛乳にかえて水筒を持参するようになった。俺自身の親兄弟との関係もぎくしゃくしている。嫁が何か新しい心配の種を仕入れてくるたび、子供に新しい命令/禁止を下すたび、俺と嫁は決着のつかない論争を繰り返した。

「何が子供にとって一番有害なのか/危険なのか」をめぐって。

「もう離婚しかあるまい」と覚悟したことも数え切れない。

   △△△

でも。

俺には嫁を放り出すことはできなかった。

「愛してるから」かと聞かれても、正直うなずけない。

そんなきれいごとにしがみついていられるには、醜悪なものを見過ぎてしまった。

でも、俺がここで見切ったら、嫁には行くところがない。

子供は俺一人でもなんとかなる自信はあるが、子供は俺のことも嫁のことも愛している。

もちろん、俺も嫁も、それぞれの人として限られた能力の限りを尽くして子供を愛している。

   △△△

四捨五入すればもう五十になろうっていうこの年で、いきなりレインマンと暮らす羽目になるとか、誰に想像できただろう。

ここで「考えや感じ方が違いすぎて落としどころさえ見つからない相手」をレインマンと呼ぶ俺には、全方向からうごうたる非難が浴びせられるだろう。

嫁のコロニーからは「人をバカにするな!」と言われるだろうし、

俺のTLで気を吐いている闘士たちからは「ダスティン・ホフマンのようなほのぼのキャラに喩えるなどぬるいわ!」と批判されるだろう。

そしてなにより、現実自閉症の人々と生活し、関わっている人たちからは、「偏見もいいところのとんだ愚か者」と指弾を受けるに違いない。この文章は、何の関係もないそれらの人々を引き合いに出す意図で書かれたものではないが、だからといって失礼が帳消しになるわけではない。そういった方々には心からお詫びしたい。

   △△△

ただ。

映画の前半で「何やってんだよ!」ってキレまくって、少しでも兄に普通の行動を取らせようと無駄努力にきゅうきゅうとしていたチャーリーが、レイモンドの目に映っている世界を、レイモンドの視点から理解して、彼に共感はできないものの、たった一人の肉親としてずっとそばにいようとするようになっていく過程を思った時、そこにはこれまでの俺の文字通りハゲになりそうな苦しみに、なんというか一条の光を投げかけてくれるヒントが潜んでいるんじゃないかって思ったのだ。

レインマン奇行を迷惑がって、施設に追いやってしまうことも一つの道だけど、

そうはできない家族にとって、できることはなんだろう。

チャーリーは、自ら悩み苦しみながら、レイモンドへの愛を見つけて再生できた。

俺はまだ、嫁への愛を見つけ出していない。

   △△△

うちのレインマンは、雨の日を極端に恐れている。

雨が降ると、家族全員に外出を禁止する。

雨じゃなくて、嫁に降り込められたうちの中で、俺はダスティン・ホフマンの顔をしたどこかのラスボスに祈りを捧げる。

――なあ、レインマン

――ここに来て、歌ってくれよ。

――心に火傷を負った俺たちみんなのために。

2011-07-16

[] Symbolについて

RubyのSymbolと文字列の違いを研究室輪講用に書いたのですが,折角なので公開したいと思います

元々学部生に対する輪講用に書いた物なので,若干上から目線ですがご了承ください.

Symbolの意義は何か

文字列とSymbolはよく似ていますプログラマから見ればどちらも文字列です.違いを一言で説明すると『プログラムが扱う』文字列か,『プログラマが見る』文字列かの違いです.例えば変数名は『文字列ですが,rubyオブジェクトである文字列』ではないですよね?

例えば,今あなたC言語お絵描きライブラリを作っているとしましょう.その中に,色で塗りつぶすfillという関数があり,色を青・赤・緑の3色から選べ,fillの引数でそれを指定できるとしましょう.

fillの引数の設定方法として一番単純なのが,0を青,1を赤,2を緑として,0〜2で選択させる方法でしょう.しかし,それでは,どの数値が何色か覚えないといけないし,fill関数を知らない人から見れば,どういう意味引数かすらさっぱり分かりません.

ではどうするかと言えば,普通BLUE = 0, RED = 1, GREEN = 2と適当に定数を設定して,その定数を引数で指定させますよね.

こうして,fill関数引数意味の無い数値から意味のある文字列に変わったことによってプログラムが分かりやすい物となります.さて,ここで注意してほしいのは,ここで言う文字列プログラムが扱うオブジェクトとしての文字列では無いということです.fill関数引数として,"BLUE","RED", "GREEN"などとC言語文字列を渡すということは普通しませんよね.それは,ここで言う文字列は,あくまでプログラマプログラムコードを分かりやすくするために必要な文字列であって,プログラムオブジェクトとして扱う(例えば,長さを求めるとかする)文字列ではないかです

分かってきたでしょうか?

プログラムコード上では(つまりプログラマから見れば)どちらも同じ文字列(文字の列という意味で)ですが,実際に動くプログラムから見れば単なる数値と本物の文字列という大きな違いです.結局,fill関数引数の具体的な値は何でもいいわけですプログラマから見て文字列であればそれだけでよく,プログラムが動くときの実際のその中身は何でもいいわけです.これのために存在するのが,Symbolであり,:fooとひとたびSymbolを作成すれば:fooの実態は適当な数値となります.(この数値がいくらかなんていうことはもちろん気にする必要はありません)

そして,もちろん同じプログラム上では:foo == :fooはちゃんと成り立ちます.もうここまでくれば,Hashのkeyとして文字列でなくSymbolを使う理由が分かりますね.Hashのkeyはあくまで,プログラマが見る(プログラムコードを分かりやすくするための)文字列であってプログラムが扱うオブジェクトとしての文字列では無くて,keyの実際の値は何でもいい,からですね.(特別な場合を除いて)Hashのkeyに対してrubyStringメソッドを使うなんてことは無いですよね.

なぜrubyにはSymbolが存在するのか

しかし,他の軽量言語ではSymbolなどなくHashのkeyとして普通に文字列を使うことが多いです.では,なぜrubyだけSymbolを使うのでしょうか.

その答えは一言でいうと,rubyの(プログラムコード上に直接書かれた,つまりリテラルの)文字列は他の言語と違いimmutable(不変)でない,からです.実際,pythonjavascript文字列(リテラル)は破壊的に変更することはできませんが,ruby文字列破壊的に変更することができます. ('abc'.concat('d')の様に)

これがどういう違いを生むかというと,コード上に直接現れる文字列がimmutable(不変)であるならば,実行時に一つだけそのオブジェクト作成し,後はそれを使いまわすという最適化ができます

そうした時,Hashのkeyの様なプログラマから見た文字列というのは,プログラムコード上のリテラルとして現れるわけですが,これらは実行時に一つだけオブジェクト作成され(特にコード上に現れる同じ文字列は全て一つのオブジェクトにまとめると),それらの比較はそれらに対する参照(そしてこれは大抵メモリアドレスなど単なる数値)の比較で済むので,結局Symbolと同じ様な働きをするわけです

本当はプログラマが見るためだけの文字列だけど,それをオブジェクトとしての文字列としても,Symbolと同じ様な働き,パフォーマンスが得られるならば,別にオブジェクトとしての文字列であってもいいわけです

繰り返しになりますが,プログラマが見るためだけの文字列は,その中身・実態は何でもいいわけですが,その実態がオブジェクトとしての文字列でも十分なパフォーマンスが得られるならば,別にオブジェクトとしての文字列でもいいわけです

さて,rubyに話を戻しますと,rubyコード上に現れる文字列であっても,実行時にそのコードを通る度に毎回新たな文字列オブジェクト作成します.

(以下のプログラムを動かすことで確認できる.)

def foo
  'foo'.object_id
end
p foo, foo

まりrubyでは文字列が可変であるため,先に述べたような最適化ができない(または難しい)ので毎回新たな文字列オブジェクト作成されるのです

こうなると,先ほどの話とはうってかわって,プログラマが見る文字列はその実態は何でもいいのに,それを文字列リテラルrubyオブジェクトとしての文字列)にしてしまうと,毎回毎回文字列オブジェクト作成されてしまうという非常にばかばかしい状況になってしまます.我々はそれらの文字列オブジェクト文字列としての操作は一切施さないのにも関わらず,です

こういうわけで,rubyではプログラマが見るためだけの文字列にSymbolというruby特有のものを使うのです

もちろん,プログラマが見るためだけの文字列を全て定数として(そしてもちろん中身は適当な値で)定義しても構わないわけですが,Hashのkeyとかで数多くのプログラマが見るためだけの文字列が現れることを考えると,とてもじゃないですけどそんなことは面倒でやってられないですよね.ですので,実行時に自動適当な値にしてくれるSymbolというもの存在するのです

以上で,Symbolについての説明を終えます.以下は蛇足です

おまけ

最初の方で出てきたfill関数rubyで実装しようとしたとき,青・赤・緑の各色はその実際の値はなんでもいいのでrubyのSymbolを使って:blue, :red, :greenとしてもいいのですが,ライブラリとかでは大抵ちゃんと定数として定義されていることが多いです

これは恐らく,定数として明示的に定義することで値の存在を明示でき,ドキュメント化の際にも役立つことによっているのでしょう.

Symbolだと,良くも悪くも定義がいりませんから

しかし,あくまでこれは外部に公開するようなライブラリでの話であって,自分が使うちょっとしたプログラムならこういう場面でも精力的にSymbolを使っていってもいいと思います.ちなみに,僕ならSymbolを使います

Symbolだと定義もいりませんし,定数は大文字ですからつのが面倒ですし,あまりソース大文字が入ると見た目がすっきりしません(主観).

Symbolは非常に便利なものですので,その意義・用途を十分に理解して,Hashのkeyにとどまらず様々な所で使えるようになりましょう.

ログイン ユーザー登録
ようこそ ゲスト さん