ie-developers / ie-questions

public questions for ie students.
10 stars 0 forks source link

gemの挙動? #22

Closed kazuminn closed 3 years ago

kazuminn commented 9 years ago

今gemoji gemを読んでいます。 https://github.com/github/gemoji

恐らく、一般的なgemの挙動?がわからないのが原因で、 gemoji gemの挙動がわからなくて投稿させてもらいました。

require 'gemoji'

print Emoji.find_by_alias("cat")

とすると、 lib/emoji.rb の50行目のname_index(hash object)は、 require 'gemoji' された時点でnewされ、 hashにjpgがrestoreされるのでしょうか?

されるなら、どんな挙動でしょうか?

tompng commented 9 years ago

requireされた時点ではnewされてないです。 names_indexは変数じゃなくてメソッドだってとこが肝かな

require 'gemoji'
Emoji.instance_eval{@names_index} #=> nil
Emoji.instance_eval{names_index}
Emoji.instance_eval{@names_index} #=> hashになってる

names_indexメソッドの初回呼び出し時に作られてますね

names_index → all → parse_data_file → self.create → edit_emoji の順で呼び出されて@names_index ||= Hash.new されてる

実際のコードとはとは違うけど、シンプルに書くとこんな感じの事ですね↓

def names_index
  unless @names_index
    #このunlessの中はnames_indexメソッドを1回目に呼んだ時しか実行されない
    @names_index = {}
    ファイル開いて読んだりいろいろ初期化処理
  end
  return @names_index
end

names_index[:key]#ここで初期化処理実行される
names_index[:key]#2回目以降は初期化処理はされない