Day5 讀書筆記&心得體會(huì)

一显晶、讀書筆記
3.2 對(duì)象和屬性

昨天我們學(xué)到KaraokeSong是Song的子類,但是我們并沒有指定Song類本身的父類是什么壹士?如果你在定義一個(gè)類時(shí)沒有指定其父類磷雇,Ruby默認(rèn)以O(shè)bject類作為其父類,這意味著所有類的始祖都是object躏救,并且Object的實(shí)例方法對(duì)Ruby的所有對(duì)象都可用唯笙。

我們現(xiàn)在創(chuàng)建的Song對(duì)象有內(nèi)部的狀態(tài)(例如歌曲名稱和演唱者),這些狀態(tài)是對(duì)象私有的——其他對(duì)象無法訪問一個(gè)對(duì)象的實(shí)例變量盒使,總體來說崩掘,這是一件好事,這意味著只有對(duì)象才有責(zé)任維護(hù)其自身的一致性少办。

不過苞慢,完全密封的對(duì)象實(shí)在沒什么用處——你可以創(chuàng)建它,但接下來你對(duì)他什么都不能做英妓,你通常定義一些訪問及操作對(duì)象的狀態(tài)挽放,讓外部世界得以與之交互绍赛,一個(gè)對(duì)象的外部可見部分被稱為其屬性(attribute)。

對(duì)我們的Song對(duì)象來說辑畦,需要做的第一件事情是找出歌曲名稱和演唱者(這樣我們可以在歌曲播放時(shí)顯示它們)以及時(shí)長(這樣我們可以顯示某種進(jìn)度條)吗蚌。

某些面向?qū)ο笳Z言(例如C++)支持多繼承,在這些語言中纯出,一個(gè)類可以有多于一個(gè)的直接父類蚯妇,并繼承每個(gè)的功能,雖然強(qiáng)大暂筝,但這種技術(shù)有危險(xiǎn)侮措,會(huì)使繼承結(jié)構(gòu)便的混亂,其他語言乖杠,例如Java和C#分扎,僅支持單繼承,其中胧洒,一個(gè)類只能有一個(gè)直接的父類畏吓,雖然清爽(并且容易實(shí)現(xiàn)),但是單繼承也有缺點(diǎn)——在現(xiàn)實(shí)世界中卫漫,對(duì)象通常從多個(gè)源繼承屬性(例如菲饼,足球是一個(gè)彈性的、圓球狀的東西)列赎。

Ruby提供了一種有趣且強(qiáng)大的折中宏悦,給了你單繼承的簡單性以及多繼承的強(qiáng)大功能,Ruby類只有一個(gè)直接的父類包吝,因此Ruby是一門單繼承語言饼煞,不過,Ruby類可以從任何數(shù)量的mixin(類似于一種部分的類定義)中引入(include)功能诗越,這提供了可控的砖瞧、類似多繼承的能力,而沒有多繼承的缺點(diǎn)嚷狞。

舉個(gè)例子:

class Song
  def name
    @name
  end
  def artist
    @artist  
  end
  def duration
    @duration
  end
end

song = Song.new("Bicyclops", "Fleck", 260)
song.artist
song.name
song.duration

返回

"Fleck"
"B..."
260

這里块促,我們定義了3個(gè)方法得到這3個(gè)實(shí)例變量的值,舉例來說床未,方法name()返回實(shí)例變量@name的值竭翠,因?yàn)檫@是一個(gè)常見的慣用手法,Ruby提供了一種方便的快捷方式:attr_reader為你創(chuàng)建這些訪問方法薇搁。

class song
  attr_reader :name, :artist, :duration
end

注意斋扰,attr_reader實(shí)際上是Ruby的一個(gè)方法,而:name等符號(hào)(Symbol)是其參數(shù),它會(huì)通過代碼求解(code evaluation)動(dòng)態(tài)地在Song類中加入實(shí)例方法體褥实,這也是Ruby meta-programming的一個(gè)示例呀狼。

song = Song.new("Bicyclops", "Fleck", 260)
song.artist   # "Fleck"
song.name # "Bicyclops"
song.duration

這個(gè)示例引入了一些新的內(nèi)容,構(gòu)成體:artist是一個(gè)表達(dá)式损离,它返回對(duì)應(yīng)artist的一個(gè)Symbol對(duì)象哥艇,你可以將:artist看作是變量artist的名字,而普通的artist是變量的值僻澎,在這個(gè)例子中貌踏,我們將訪問方法命名為name、artist和duration窟勃。對(duì)應(yīng)的實(shí)例變量@name祖乳、@artist和@duration會(huì)自動(dòng)被創(chuàng)建。這些訪問方法和我們?cè)缦仁謱懙哪切┦堑韧摹?/p>

3.2.1 可寫的屬性
有些時(shí)候秉氧,你需要能夠在一個(gè)對(duì)象外部設(shè)置它的屬性眷昆,例如,讓我們假定某一首歌的時(shí)長最初是預(yù)估得來的(可能從CD或MP3數(shù)據(jù)的信息中產(chǎn)生而來)汁咏。當(dāng)我們第一次播放這首歌時(shí)亚斋,會(huì)得到它實(shí)際的長度,并將這個(gè)新的值保存回Song對(duì)象中攘滩。

在類如C++和Java等語言中帅刊,你需要用setter方法來完成這個(gè)任務(wù)。

class JavaSong {
  private Duration _duration;
  public void setDuration(Duration newDuration) {
    _duration = newDuration
  }
}
s = new JavaSong(...);
s.setDuration(length);

在Ruby中漂问,訪問對(duì)象屬性就像訪問其他變量一樣赖瞒,我們?cè)谇懊嬉呀?jīng)看到,例如song.name語句蚤假,因此栏饮,當(dāng)你想要設(shè)置某個(gè)屬性的值時(shí),對(duì)這些變量直接賦值似乎更自然些勤哗,在Ruby中抡爹,你可以通過創(chuàng)建一個(gè)名字以等號(hào)結(jié)尾的方法來達(dá)成這一目標(biāo),這些方法可以作為賦值操作的目標(biāo)芒划。

class Song
  def duration = (new_duration)
    @duration = new_duration
  end
end
song = Song.new("Bicyclops", "Fleck", 260)
song.duration # 260
song.duration = 257
song.duration # 257

賦值操作song.duration = 257 調(diào)用了song對(duì)象中的duration=方法,并將257作為參數(shù)傳入欧穴,實(shí)際上民逼,定義一個(gè)以等號(hào)結(jié)尾的方法名,便使其能夠出現(xiàn)在復(fù)制操作的左側(cè)涮帘。

同樣拼苍,Ruby又提供了一種快捷方式創(chuàng)建這類簡單的屬性設(shè)置方法。

class Song
  attr_writer :duration
end
song = Song.new("Bicyclops", "Fleck", 260)
song.duration = 257

3.2.2 虛擬屬性

這類屬性訪問的方法并不必須是對(duì)象實(shí)例變量的簡單包裝(wrapper),例如疮鲫,你可能希望訪問以分鐘為單位吆你,而不是我們已經(jīng)實(shí)現(xiàn)的以秒為單位的時(shí)長。

class Song
  def duration_in_minutes
    @duration/60.0 
  end
  def duration_in_minutes=(new_duration)
    @duration = (new_duration*60).to_i 
  end
end
song = Song.new("Bicyclops", "Fleck", 260)
song.duration_in_minutes # 4.33333333333333
song.duration_in_minutes = 4.2
song.duration # 252

這里我們使用屬性方法創(chuàng)建了一個(gè)虛擬的實(shí)例變量俊犯,對(duì)外部世界來說妇多,duration_in_minutes就像其他屬性一樣,然而燕侠,在內(nèi)部它沒有對(duì)應(yīng)的實(shí)例變量者祖。

這遠(yuǎn)非出于討巧,在Bertrand Meyer的劃時(shí)代著作Object-Oriented Software Construction中绢彤,他將它稱為統(tǒng)一訪問原則七问,通過隱藏實(shí)例變量與計(jì)算的值得差異,你可以向外部世界疲敝類的實(shí)現(xiàn)茫舶,將來你可以自由地更改對(duì)象如何運(yùn)作械巡,而不會(huì)影響使用了你的類的、數(shù)以百萬行計(jì)的代碼饶氏。這是一種很大的成功坟比。

3.2.2 屬性、實(shí)例變量及方法

這種對(duì)屬性的描述嚷往,可能會(huì)讓你認(rèn)為它們無外乎就是方法——為什么我們要為它們發(fā)明一個(gè)新奇的名字呢葛账?從某種程度上,這絕對(duì)是正確的皮仁,屬性就是一個(gè)方法籍琳,某些時(shí)候,屬性簡單的返回實(shí)例變量的值贷祈,某些時(shí)候趋急,屬性返回計(jì)算后的結(jié)果,并且某些時(shí)候势誊,那些名字以等號(hào)結(jié)尾的古怪方法呜达,被用來更新對(duì)象的狀態(tài),那么問題是粟耻,哪里是屬性結(jié)束而一般方法開始的地方呢查近?是什么讓它變成屬性的呢?

當(dāng)你設(shè)計(jì)一個(gè)類的時(shí)候挤忙,你決定其具有什么樣的內(nèi)部狀態(tài)霜威,并決定這內(nèi)部狀態(tài)對(duì)外界(類的用戶)的表現(xiàn)形式。內(nèi)部狀態(tài)保存在實(shí)例變量中册烈,通過方法暴露出來的外部狀態(tài)戈泼,我們稱之為屬性。

你的類可以執(zhí)行的其他動(dòng)作,就是一般方法大猛,這并非一個(gè)非常重要的區(qū)別扭倾,但是通過把一個(gè)對(duì)象的外部狀態(tài)稱為屬性,可以幫助人們了解你所編寫的類挽绩。

3.3 類變量和類方法

到目前為止膛壹,所有我們創(chuàng)建的類都包括有實(shí)例變量和實(shí)例方法:變量被關(guān)聯(lián)到類的某個(gè)特定實(shí)例,以及操作這些變量的方法琼牧。有時(shí)候恢筝,類本身需要它們自己的狀態(tài)。這是類變量的領(lǐng)地巨坊、

3.3.1 類變量

類變量被類的所有對(duì)象共享撬槽,它與我們稍后描述的類方法相關(guān)聯(lián)。對(duì)一個(gè)給定的類來說趾撵,類變量只存在一份拷貝侄柔。類變量由兩個(gè)@符開頭,例如@@count占调。與全局變量和實(shí)例變量不同暂题,類變量在使用之前必須被初始化,通常究珊,初始化就是在類定義中簡單賦值薪者。

class Song
  @@play = 0
  def initialize(name, artist, duration)
    @name = name
    @artist = artist
    @duration = duration
    @plays = 0
  end
  
  def play
    @plays += 1
    @@plays += 1
    "This song: #@plays plays. Total #@@plays plays."
  end
end

出于調(diào)試的目的,我們還讓Song#play返回一個(gè)字符串剿涮,其中包括該歌曲被播放的次數(shù)言津,以及所有歌曲播放的總次數(shù),我們可以很容易測試它取试。

s1 = Song.new("Song1", "Artist1", 234)
s2 = Song.new("Song2", "Artist2", 345)
s1.play # "This song : 1 plays. Total 1 plays."
s2.play # "This song : 1 plays. Total 2 plays."
s1.play # "This song : 2 plays. Total 3 plays."
s2.play # "This song : 3 plays. Total 4 plays."

類變量對(duì)類及其實(shí)例都是私有的悬槽,如果你想要讓它們能夠被外部世界訪問,你需要編寫訪問方法瞬浓,這個(gè)方法要么是一個(gè)實(shí)例方法初婆,或者是緊接著在下一節(jié)要介紹的類方法。

3.3.2 類方法
有時(shí)猿棉,類需要提供不束縛于任何特定對(duì)象的方法磅叛。我們已經(jīng)見過一個(gè)這樣的方法,new方法創(chuàng)建一個(gè)新的Song對(duì)象铺根,但是new方法本身并不與一個(gè)特定的歌曲對(duì)象相關(guān)聯(lián)宪躯。

song = Song.new(....)

我們會(huì)發(fā)現(xiàn)類方法遍布于Ruby庫中。例如位迂,F(xiàn)ile類的對(duì)象用來表示在底層文件系統(tǒng)中打開的一個(gè)文件忘巧。不過,F(xiàn)ile類還提供了幾個(gè)類方法來操作文件宪祥,而它們并未打開文件鼓蜒,因此也沒有相應(yīng)的File對(duì)象,如果你想要?jiǎng)h除一個(gè)文件泻帮,你可以調(diào)用類方法File.delete精置,傳入文件名作為參數(shù)。

File.delete("domend.txt")

類方法和實(shí)例方法是通過它們的定義區(qū)別開來的锣杂,通過在方法名之前放置類名以及一個(gè)句點(diǎn)脂倦,來定義方法。

class Example
  def instance_method
  end
  def Example.class_method
  end
end

點(diǎn)唱機(jī)按播放的每首歌曲收費(fèi)元莫,而非按分鐘收費(fèi)赖阻,這使得短歌曲比長歌更有助于盈收。我們可能希望避免那些過長的歌曲出現(xiàn)在SongList中踱蠢,我們可以在SongList中定義一個(gè)類方法檢查火欧,是否某一首歌超過了時(shí)限。我們使用一個(gè)類的常量設(shè)置時(shí)限茎截,就是在一個(gè)類代碼中初始化的常量(記得常量嗎苇侵?它們使用一個(gè)大寫字母開頭)。

class SongList
  MAX_TIME = 5*60

  def SongList.is_too_long(song)
    return song.duration > MAX_TIME
  end
end

song1 = Song.new("Bicyclops", "Fleck", 260)
SongList.is_too_long(song1)  # false
song2 = Song.new("The Calling", "Santana" 468)
SongList.is_too_long(song2) # true

有些時(shí)候企锌,你希望覆寫(override)Ruby默認(rèn)創(chuàng)建對(duì)象的方式榆浓。舉例來說,看看我們的點(diǎn)唱機(jī)撕攒。因?yàn)槲覀儗⒂性S多點(diǎn)唱機(jī)分布在全國各地陡鹃,我們希望讓維護(hù)工作盡可能簡單,其中一個(gè)需求是記錄點(diǎn)唱機(jī)發(fā)生的所有事情:播放歌曲打却、收到的點(diǎn)歌費(fèi)杉适、傾倒進(jìn)去的各種奇怪液體等等。

因?yàn)槲覀兿M麨橐魳繁A艟W(wǎng)絡(luò)寬帶柳击,因此我們將日志文件保存本地猿推。這意味著我們需要一個(gè)類來處理日志。不過捌肴,我們希望每個(gè)點(diǎn)唱機(jī)只有一個(gè)記錄日志的對(duì)象蹬叭,并且我們希望其他所有對(duì)象都共享同一個(gè)日志對(duì)象。

這里適用Singleton模式状知,在《Design Patterns(設(shè)計(jì)模式)》一書中記載秽五,我們將進(jìn)行一些調(diào)整,使得只有一種方式創(chuàng)建日志對(duì)象饥悴,那就是調(diào)用MyLogger.create坦喘,并且我們還保存只有一個(gè)日志對(duì)象被創(chuàng)建盲再。

class MyLogger 
  private_class_method :new
  @@logger = nil
  def MyLogger.create
    @@logger = new unless @@logger
    @@logger
  end
end

通過將MyLogger的new方法標(biāo)記為private(私有),我們阻止所有人使用傳統(tǒng)的構(gòu)造函數(shù)來創(chuàng)建日志對(duì)象瓣铣。相反答朋,我們提供了一個(gè)類方法,MyLogger.crate棠笑。這個(gè)方法使用了類變量@@logger來保存唯一一個(gè)日志對(duì)象實(shí)例的引用梦碗,并在每次被調(diào)用時(shí)返回。

實(shí)際上蓖救,你可以用很多方式來定義類方法洪规,但是理解這些方式為什么有效,我們需要等到第24章循捺。
下面是在類Demo內(nèi)定義類方法斩例。

class Demo
  def Demo.meth1
    # ....
  end
  def self.meth2
    # ...
  end
  class <<self
    def meth3
      # ...
    end
  end
end

這個(gè)實(shí)例,我們可以通過查看方法返回對(duì)象的標(biāo)識(shí)符來檢驗(yàn)巨柒。

MyLogger.create.object_id
MyLogger.create.object_id

使用類方法作為偽構(gòu)造函數(shù)(pseudo-constructors),可以讓使用類的用戶更輕松些樱拴。舉個(gè)簡單的例子,讓我們看一個(gè)表示等邊多邊形的Shape類洋满。通過將所需的邊數(shù)和周長傳入構(gòu)造函數(shù)來創(chuàng)建Shape的實(shí)例晶乔。

class Shape
  def initialize(num_sides, perimeter)
    # ...
  end
end

注意:我們這里演示的singleton實(shí)現(xiàn)并非是線程安全的;如果多個(gè)線程在運(yùn)行牺勾,有可能會(huì)創(chuàng)建多個(gè)日志對(duì)象正罢。與其我們自己添加線程安全,不如使用Ruby提供的Singleton mixin驻民。

不過翻具,幾年之后,另一個(gè)不同的應(yīng)用使用了這個(gè)類回还,其中的程序員習(xí)慣于通過名字裆泳、并指定每條邊的長度而不是周長來創(chuàng)建圖形,只需要在Shape中添加若干類方法柠硕。

class Shape
  def Shape.triangle(side_lenght)
    Shape.new(3, side_lenght*3)
  end 
  def Shape.square(side_lenght)
    Shape.new(4, side_length*4)
  end
end

類方法有許多有趣并強(qiáng)大的用途工禾,為了使我們的點(diǎn)唱機(jī)產(chǎn)品盡可能快地完成,這里就不再繼續(xù)深入探究了蝗柔,讓我們繼續(xù)前進(jìn)吧闻葵!

3.4 訪問控制(Access Controller)
當(dāng)我們?cè)O(shè)計(jì)類的接口時(shí),需要著重考慮你的類想要向外部世界暴露何種程度的訪問癣丧。如果你的類允許過度的訪問槽畔,會(huì)增加應(yīng)用中耦合的風(fēng)險(xiǎn)——類的用戶可能會(huì)依賴于類實(shí)現(xiàn)的細(xì)節(jié),而非邏輯性的接口胁编。好消息是厢钧,在Ruby中改變一個(gè)對(duì)象的狀態(tài)鳞尔,唯一的簡單方式是調(diào)用它的方法。

控制對(duì)方法的訪問坏快,你就需要空控制對(duì)對(duì)象的訪問铅檩,一個(gè)經(jīng)驗(yàn)法則是憎夷,永遠(yuǎn)不要暴露會(huì)導(dǎo)致對(duì)象出于無效狀態(tài)的方法莽鸿,Ruby為你提供了三中級(jí)別的保護(hù)。

  • Public 沒有限制拾给,方法默認(rèn)是public的(initialize除外祥得,它是private的)
  • Protected 只能被定義了該方法的類或其他子類的對(duì)象調(diào)用。整個(gè)家族均可訪問蒋得。
  • Private 不能被明確的接受者調(diào)用级及,其接受者只能是self,這意味著私有方法只能在當(dāng)前對(duì)象的上下文中被調(diào)用额衙,你不能調(diào)用另一個(gè)對(duì)象的私有方法饮焦。

“protected”和“private”之前的區(qū)別很微妙,并且和其他大多數(shù)普通的面相對(duì)象語言不同窍侧,如果方法是保護(hù)的县踢,他可以被定義了該方法的類或者子類的實(shí)例所調(diào)用,如果方法是私有的伟件,它只能在當(dāng)前對(duì)象的上下文中被調(diào)用——不可能直接訪問其他對(duì)象的私有方法硼啤,即便它與調(diào)用者都屬同一個(gè)類的對(duì)象。

Ruby和其他面向?qū)ο笳Z言的差異斧账,還體現(xiàn)在另一個(gè)重要的方面谴返,訪問控制是在程序運(yùn)行時(shí)動(dòng)態(tài)判定的,而非靜態(tài)判定咧织。只有當(dāng)代碼試圖執(zhí)行受限的方法嗓袱,你才會(huì)得到一個(gè)訪問違規(guī)。

3.4.1 訪問控制(Specifying Access Control)

你可以使用public习绢、protected和private3個(gè)函數(shù)(function)渠抹,來為類或模塊定義內(nèi)的方法(method)指定訪問級(jí)別,你可以以兩種不同的方式使用每個(gè)函數(shù)毯炮。

如果使用時(shí)沒有參數(shù)逼肯,這3個(gè)函數(shù)設(shè)置后續(xù)定義方法的默認(rèn)訪問控制,如果你是C++或者Java程序員桃煎,這應(yīng)該是你熟悉的行文篮幢,你同樣使用類似public的關(guān)鍵字來取得相同的效果。

class MyClass
  def method
    # ..
  end
  protected # subsequent method will be 'protected'
    def method2 # will be 'protected'
      # ..
    end
  private
    def method3 # will be private
      # ..
    end
end

另外为迈,你可以通過將方法名作為參數(shù)列表傳入訪問控制函數(shù)來設(shè)置它們的訪問級(jí)別三椿。

class MyClass
  def method
  end
  public :method1, :method4
  private :method2
end

舉個(gè)例子缺菌,假設(shè)我們要為一個(gè)會(huì)計(jì)系統(tǒng)建立模型,其中每個(gè)借方都有對(duì)應(yīng)的信用搜锰,因?yàn)槲覀兿M_保沒有人破壞這個(gè)規(guī)則伴郁,所以我們讓有關(guān)借方和信用的方法均稱為私有。并定義外部的交易接口蛋叼。

class Accounts
  def initialize(checking, saving)
    @checking = checking
    @saving = savings
  end
  private
    def debit(account, amount)
      account.balance -=amount
    end
    def credit(account, amount)
      account.balance +=amount
    end
  public
    def transfer_to_savings(amount)
      debit(@checking, amount)
      credit(@savings, amount)
    end
 end

二焊傅、心得體會(huì)
今天完成了什么?

  • 花了兩個(gè)小時(shí)看了《Programmin Ruby》3.2狈涮、3.3節(jié)
  • 繼續(xù)看application.rb剩余部分
  • admin/logs

今天收獲了什么狐胎?

  • logs_controller.rb文件
class Admin...Controller
# Admin...Controller繼承A...Controller
  def index
    @records = model.includes(:or) 
    # 引用父類ApplicationController的model方法,把日志的每一條數(shù)據(jù)都查詢出來
    super
  end
end
  • 日志視圖index
ruby:
  .. = {
    collections: %i[ search .. ], # 搜索集歌馍,%i生成一個(gè)Symbol數(shù)組
    ...
  } #這是一個(gè)hash數(shù)據(jù)流握巢,返回給table顯示
= render 'ad...ble', .. 
  • 日志視圖show
ruby:
  fields = { # 返回每條日志的具體信息
    o..d: {},
    ..
  }
= render 'ad..m', fields: fields
  • operator.rb
  belongs_to ...n_key: :id #引用外鍵
  has_many ...inverse_of ::op.. #模型的關(guān)聯(lián)是單向綁定。當(dāng)一個(gè)關(guān)聯(lián)為a:belongs_to時(shí)松却,inverse_of選項(xiàng)基??本上給我們雙向內(nèi)存綁定暴浦。https://www.viget.com/articles/exploring-the-inverse-of-option-on-rails-model-associations
  has_many :.., -> { enabled }, through: :..是什么意思
  has_many :.., through: :..
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市带射,隨后出現(xiàn)的幾起案子同规,更是在濱河造成了極大的恐慌,老刑警劉巖窟社,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件券勺,死亡現(xiàn)場離奇詭異,居然都是意外死亡灿里,警方通過查閱死者的電腦和手機(jī)关炼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來匣吊,“玉大人儒拂,你說我怎么就攤上這事∩В” “怎么了社痛?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長命雀。 經(jīng)常有香客問我蒜哀,道長,這世上最難降的妖魔是什么吏砂? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任撵儿,我火速辦了婚禮乘客,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘淀歇。我一直安慰自己易核,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布浪默。 她就那樣靜靜地躺著牡直,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浴鸿。 梳的紋絲不亂的頭發(fā)上井氢,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音岳链,去河邊找鬼。 笑死劲件,一個(gè)胖子當(dāng)著我的面吹牛掸哑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播零远,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼苗分,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了牵辣?” 一聲冷哼從身側(cè)響起摔癣,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纬向,沒想到半個(gè)月后择浊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逾条,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年琢岩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片师脂。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡担孔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吃警,到底是詐尸還是另有隱情糕篇,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布酌心,位于F島的核電站拌消,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谒府。R本人自食惡果不足惜拼坎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一浮毯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧泰鸡,春花似錦债蓝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至余舶,卻和暖如春啊鸭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匿值。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來泰國打工赠制, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人挟憔。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓钟些,卻偏偏與公主長得像,于是被迫代替她去往敵國和親绊谭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子政恍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容