タグ

ブックマーク / qiita.com/arcage (8)

  • クラス継承とモジュールmix-inの挙動の違い - Qiita

    クラス(もしくは構造体,以下同様)の継承とモジュールのmix-inは,多くの面でよく似た様な挙動を示します。 例えば,あるクラスAを継承したクラスBのインスタンスbに対してb.is_a?(A)はtrueを返しますし,あるモジュールCをmix-inしたクラスDのインスタンスdに対してd.is_a?(C)もやはりtrueを返します。 class A end class B < A end b = B.new p b.is_a?(A) #=> true module C end class D include C end d = D.new p d.is_a?(C) #=> true また,親クラスで定義されたメソッドをオーバーライドした際も,mix-inしたモジュールで定義されたメソッドをオーバーライドした際も,superでオーバーライド元のメソッドを呼び出すことができます。 class A

    クラス継承とモジュールmix-inの挙動の違い - Qiita
  • [Crystal] 「配列」っぽい型 - Qiita

    複数の要素からなるリストを扱う型としてはArray(配列)がその代表格ですが,それ以外にも「配列」っぽい型がいくつか存在しています。ここでは似ているようで異なるこれらの型を簡単にご紹介します。 Slice(T) Sliceにリテラル表現はありませんが,Arrayリテラルとよく似たSlice[...]という特殊な構文(マクロ)でSliceオブジェクトを生成することができます。

    [Crystal] 「配列」っぽい型 - Qiita
  • [Crystal] 「ハッシュ」っぽい型 - Qiita

    「配列」っぽい型に続いて「っぽい型」シリーズ第二弾(おそらく打ち止め)です。 上の記事ではArrayっぽい型をいくつかご紹介しました。Arrayほどではないにしろ,Arrayと並ぶコレクション界の雄「Hash」にも1つだけ「っぽい型」が存在します。 NamedTuple(**T) NamedTupleは,NamedTuple.fromにHashを与えて生成できるほか,{key: value, ...}というリテラル構文を持っています。後者の構文は,RubyではシンボルをキーとしたHashのリテラル構文ですが,Crystalでは{:key => value}と{key: value}が異なる型(前者はHash,後者はNamedTuple)のオブジェクトになるので注意が必要です。 # 両方とも同じ結果 p named_tuple = NamedTuple(name: String, age:

    [Crystal] 「ハッシュ」っぽい型 - Qiita
  • [crystal] Ruby書きが躓いた小石集 - Qiita

    これは,Crystal Advent Calendar 2015 12月7日分の記事です。 はじめに Ruby の文法に強くインスパイアされ,シンプルなものであれば Ruby スクリプトがそのまま動いてしまうこともある Crystal ですが,それだけに思わぬところで Ruby の流儀が通用しなくて戸惑うことがあります。 例えば,暗黙の文字列変換を指定しようとして#to_sをオーバーライドしても予想通りの動きをしないとか,初期化のタイミングによってインスタンス変数がコンパイラにnilableだと判断されるなどなど。 たいていの問題はドキュメントやAPIリファレンスをじっくり読むと解決したりするのですが,縁あって「Crystal Advent Calendar 2015」にお誘いいただいたので,個人レベルで数年に渡って日曜プログラミングとしてRubyと付き合ってきた人間が,Crystal で

    [crystal] Ruby書きが躓いた小石集 - Qiita
  • [Crystal] クラス定義周りの便利マクロ - Qiita

    追記あり Crystal Advent Calendar 2015のネタを書くにあたって,改めてドキュメントやAPIリファレンスを読み返してみると,クラス定義周りのマクロが非常に充実していることに気づいたので,備忘録代わりにまとめてみました。 はじめに 自作クラスを定義しようとすると,お約束のように定義することになるメソッドがいくつか存在します。 インスタンス変数に対するアクセサなどはRubyでも専用の書式が用意されていましたが,Crystalではそれだけでなく等価演算子 #==,Hashキーの同一性チェックに使用される#hash,さらにはインスタンス変数へのメソッドの移譲についてまでマクロが用意されています。 アクセサ定義 アクセサ定義系のマクロには,対象とするインスタンス変数名をシンボルリテラル(:name),文字列リテラル("name"),もしくは名前ベタ書き(name)で指定します

    [Crystal] クラス定義周りの便利マクロ - Qiita
  • [Crystal] 「自分が使いたいから」公開したライブラリ達 - Qiita

    ここのところすっかりCrystalにどっぷりで,趣味仕事にと汎用性のないCrystalのコードを書き散らかしているʕ•ᴥ•ʔAKJです。 とはいえ,普段は手元のMacBookでコードを書いて,それらを使うのは別のLinuxサーバ(複数)という環境のため,サーバ個別の機能はともかく共通部品をそれぞれのサーバへ展開するのが結構手間,という状況が出てきました。 CrystalにはRubyのGem(+Bundler)に相当するShardという仕組みが標準で用意されていて,GitHubなどで公開されている標準添付以外のライブラリを,自分のプロジェクトへ比較的簡単に追加することができるのですが,自作のライブラリをShardとして公開するのも比較的簡単に行うことができます。実際,crystal init lib で作成される雛形上にコードを書いて,GitHubに公開したらそれだけで別プロジェクトからS

    [Crystal] 「自分が使いたいから」公開したライブラリ達 - Qiita
  • #Crystal : initialize 中の self 利用(追記あり) - Qiita

    追記あり メモ 動的型付け言語のRubyでその恩恵を目一杯受けていたコードを,Crystalなど静的型付け言語へ移植しようとすると,思わぬ小石に躓くことが多い。 今日の小石は inialize 中の self 。 親子関係のあるオブジェクト間で相互参照したいようなとき,基的に「実際に使用される瞬間の状態がすべて」な Ruby だと class Parent attr_reader :name attr_reader :child def initialize(_name) @name = _name @child = Child.new(self) end end class Child attr_reader :parent def initialize(_parent) @parent = _parent end end the_parent = Parent.new("John")

    #Crystal : initialize 中の self 利用(追記あり) - Qiita
  • Crystal:オブジェクトに対する暗黙の文字列変換 - Qiita

    追記あり RubyからCrystalへ移植しようとして躓いた点その1。 Rubyだとオブジェクトに to_s() メソッドが定義されていれば,puts や文字列内の式展開で暗黙のうちに to_s() で文字列変換された結果が使用される。一方,Crystalでは to_s() を定義しただけでは,暗黙の文字列変換で使用されない。 class Person def initialize(name) @name = name end def to_s "Hi, I'm #{@name}." end end puts Person.new("John")

    Crystal:オブジェクトに対する暗黙の文字列変換 - Qiita
  • 1