Kotlin 學(xué)習(xí)筆記(三)函數(shù)的調(diào)用、中綴相嵌、解構(gòu)腿时、頂層擴(kuò)展函數(shù) 使用

PineLogSP_ZH-CN1105763820_1920x1080.jpg

前言
本文章只是用于記錄學(xué)習(xí),所以部分地方如果有錯誤或者理解不對的地方饭宾,麻煩請指正批糟。本篇為 csdn 原文章 轉(zhuǎn)移修改版 原文章

Kotlin 學(xué)習(xí)筆記(二)

簡述:

  1. kotlin 中集合如何簡單的創(chuàng)建
  2. kotlin 中函數(shù)如何定義 及 更好、更明白的調(diào)用
  3. kotlin 中頂層函數(shù) 和頂層屬性的簡單使用
  4. kotlin 中擴(kuò)展函數(shù) 和 擴(kuò)展屬性的講解
  5. kotlin 中中綴 方法的使用 和 簡單了解
  6. kotlin 中解構(gòu) 使用

1. 集合

    // set
    val set = hashSetOf(1,2,3)
    // list
    val arr = arrayListOf(2,3,4,5)
    // hashmap
    val map = hashMapOf(1 to "A",2 to "B")

?? 上述代碼 展示的是一半的 set 看铆, arraylist 徽鼎, hashmap 三種數(shù)據(jù)結(jié)構(gòu)的創(chuàng)建方法,kotlin 中的 集合部分都是沿用了 java 的 集合類弹惦,在java 的基礎(chǔ)上包裹了一層否淤,更方便開發(fā)者的調(diào)用 和 創(chuàng)建。在java 的基礎(chǔ)上 還進(jìn)行了一部分api 的封裝棠隐。

// 獲取數(shù)組中最后一個
arr.last()
// 獲取數(shù)組中最大的一個
arr.max()

?? 為了 方便開發(fā)人員石抡,更好的知道函數(shù)的用法,我們也可以在 方法頭部添加注釋宵荒,包括方法名稱的定義和參數(shù) 名稱的設(shè)置汁雷,合理的設(shè)置净嘀,可以提升代碼的閱讀力,當(dāng)然侠讯,kotlin也為我們做了一些事情

fun getColor(color :Color){
    when(color){
        Color.BLUE ,Color.RED -> println("this is blue or red")
        Color.GREEN -> println("this is GREEN")
    }
}

// 普通調(diào)用
getColor(Color.GREEN)
// 優(yōu)化后的調(diào)用
getColor(color = Color.GREEN)

?? 如果你是開發(fā)人員挖藏,在看著 第二種調(diào)用方法,會更加簡單明了的知道這個參數(shù)是干什么的 厢漩,我們應(yīng)該怎么傳膜眠,but,如果我們在調(diào)用的時候 指明了參數(shù)的名稱溜嗜,為了避免混淆宵膨,后邊的參數(shù)也有點要 指明 參數(shù)名稱。

2.函數(shù)定義炸宵、頂層函數(shù) 和屬性

2.1 函數(shù)的定義 及調(diào)用

1辟躏、函數(shù)的定義使用關(guān)鍵字"fun",函數(shù)參數(shù)格式為: "參數(shù):類型",函數(shù)返回值類型 "fun(...): Int"

fun sum(a: Int, b: Int, c: Int): Int {
    return a + b + c
}

2、表達(dá)式作為函數(shù)體土全,返回值的類型可以省略捎琐,可以利用Kotlin的類型推導(dǎo)功能,推測出函數(shù)返回值的類型裹匙。

fun sum(a: Int, b: Int, c: Int) = a + b + c

3瑞凑、無返回值的函數(shù)(類似Java中的void空類型返回值)

// Unit 也可以省略不寫

fun printSum(a: Int, b: Int, c: Int): Unit {
    println(a + b + c)
}

4、可變長參數(shù)函數(shù)可以使用 "vararg" 關(guān)鍵字標(biāo)識類似Java中的public void setData(Object... objects)概页。

fun vars(vararg args: Int) {
    for (arg in args) {
        print(arg)
    }
}

5籽御、lambda(匿名函數(shù))

val sumLambda: (Int, Int, Int) -> Int = { a, b, c -> a + b + c }

6 函數(shù)調(diào)用

在Kotlin函數(shù)中有這么一種參數(shù)叫做命名參數(shù),它能允許在函數(shù)調(diào)用的地方指定函數(shù)名,這樣就能很好使得調(diào)用地方的參數(shù)和函數(shù)定義參數(shù)一一對應(yīng)起來惰匙,不會存在傳遞參數(shù)錯亂問題技掏。

println(printSum(a=1,b=2,c=3))

AndroidStudio3.0帶命名參數(shù)的函數(shù)調(diào)用高亮提示更加醒目

?2.2 頂層函數(shù)

?? 該節(jié)點我們先使用兩段代碼,就很好的了解頂層函數(shù)說的什么意思了徽曲。
main

import util.*

fun main(args: Array<String>) {
    HelloWorld()
}

Util

package util

fun HelloWorld(){
    println("hello")
}

?? 看完上邊兩個代碼塊零截,我們就大致了解 頂層函數(shù)麸塞,類似于 我們java 中的 Util類秃臣,我們在main 中通過 依賴util .* ,就可以直接在類中使用 util中的方法哪工,并且不用想java 中的 還有前邊加上 類名.方法名 來調(diào)用奥此。

java的Util 情況。相對于我們寫過的項目雁比,不管大小稚虎,都會有一個Util文件將愛專門放一些 靜態(tài)函數(shù),我們一個界面或者 一個Model 里邊都會引用很多其他地方的類偎捎。
Kotlin 中的 頂層函數(shù):根本不需要創(chuàng)建那么多類蠢终,我們可以繼續(xù)寫util 類序攘,但是我們直接把函數(shù)放在文件的頂層,這樣不用從屬與任何的類寻拂,并且還是 該類中的一部分程奠,如果在包外,我們就可以通過 import 的方式引入祭钉,并且外邊也不用包一層瞄沙。

2.3 關(guān)于頂層函數(shù)實質(zhì)原理

要想知道內(nèi)部調(diào)用原理很簡單,我們只需要把上面例子代碼反編譯成Java代碼就一目了然了慌核。這里科普一下反編譯Kotlin代碼步驟距境,因為這是查看Kotlin語法糖背后實質(zhì)很好的方法。

步驟一: 確認(rèn)IDE安裝好了Kotlin Plugin
步驟二: 在IDE中打開你需要查看反編譯的代碼文件垮卓,然后打開頂部的"Tools",選擇"Kotlin",再選擇"Show Kotlin ByteCode"


在這里插入圖片描述

步驟三: 左邊是Kotlin的源碼垫桂,右邊是Kotlin的ByteCode


在這里插入圖片描述

步驟四: 點擊右側(cè)“Decompile”
在這里插入圖片描述

通過以上的代碼可以總結(jié)出兩點內(nèi)容:

1、頂層文件會反編譯成一個容器類粟按。(類名一般默認(rèn)就是頂層文件名+"Kt"后綴伪货,注意容器類名可以自定義)
2、頂層函數(shù)會反編譯成一個static靜態(tài)函數(shù)钾怔,如代碼中的formateFileSize和main函數(shù)

對于Java中如何調(diào)用Kotlin中的頂層函數(shù)了吧碱呼。調(diào)用方式很簡單,就是利用反編譯生成的類作為靜態(tài)函數(shù)容器類直接調(diào)用對應(yīng)的函數(shù)

System.out.println("文件大小: " + FormateFileKt.formateFileSize(1111));// Java中調(diào)用Kotlin中定義頂層函數(shù)宗侦,一般是頂層文件名+"Kt"后綴作為靜態(tài)函數(shù)的類名調(diào)用相應(yīng)函數(shù)

2.4 頂層函數(shù)名稱修改

Kotlin中的頂層函數(shù)反編譯成的Java中的容器類名一般是頂層文件名+“Kt”后綴作為類名愚臀,但是也是可以自定義的。也就是說頂層文件名和生成容器類名沒有必然的聯(lián)系矾利。通過Kotlin中的@file: JvmName("自定義生成類名")注解就可以自動生成對應(yīng)Java調(diào)用類名姑裂,注意需要放在文件頂部,在package聲明的前面

@file: JvmName("FormateUtil")
package com.ymc.kotlindemo

import java.math.BigDecimal

fun formateFileSize(size: Double): String { ... }

我們通過同樣的方法看下 kotlin 會生成怎么的文件內(nèi)容


在這里插入圖片描述

這樣Java調(diào)用自定義類名頂層函數(shù)就更加自然男旗,一般建議使用注解修改類名舶斧,這樣在Java層調(diào)用還是我們習(xí)慣工具類的命名,完全無法感知這個函數(shù)是來自Java中還是Kotlin中定義的察皇,做到完全透明茴厉。

System.out.println("文件大小: " + FormateUtil.formateFileSize(1111));

2.5 頂層屬性

?? 和 頂層函數(shù) 相似,屬性也是可以放在文件的頂層

BUtil

var index = 0
const val indexx = 0

fun todoSomething(){
    index ++
}

main

import util.indexx

fun main(args: Array<String>) {
    println(indexx)
}

?? 和頂層函數(shù)一樣的什荣,不過這里學(xué)到了新的關(guān)鍵詞 const 矾缓,他等同于 java 中的 public static final ,因為不可變稻爬,所以 const val 標(biāo)配嗜闻。

?? 總結(jié):使用頂層函數(shù)和屬性從此消除Java中的static、中綴表達(dá)式調(diào)用和解構(gòu)聲明等桅锄。

3.擴(kuò)展函數(shù)和屬性

擴(kuò)展部分 算是kotlin 的一大特色琉雳,擴(kuò)展函數(shù) 擴(kuò)展屬性 同理样眠,其實 他就是成員內(nèi)的函數(shù)或者 屬性,但是寫在了 成員外部翠肘。

?3.1 擴(kuò)展函數(shù)

?? 只需要把擴(kuò)展的類或者接口名稱吹缔,放到即將要添加的函數(shù)名前面。這個類或者名稱就叫做接收者類型锯茄,類的名稱與函數(shù)之間用"."調(diào)用連接厢塘。this指代的就是接收者對象,它可以訪問擴(kuò)展的這個類可訪問的方法和屬性肌幽。

// 擴(kuò)展 函數(shù)
fun String.lastData() : Char{
    return this.get(this.length-1)
}


// 獲取最后一個單詞
import util.lastData

println("Kotlin".lastData())

?? 從上邊代碼中晚碾,我們可以看出 我們想要擴(kuò)展的類 或者接口名稱,添加在函數(shù)名稱的前面 喂急,這個 類的名稱 稱為 接收者類型格嘁,所以在本例中 String 就是接收者類型,而 “kotlin” 就是接收者對象廊移,其實我們這樣寫糕簿,就相當(dāng)于給String 添加了一個方法。但是擴(kuò)展函數(shù)是 不希望你打破 原有類的封裝性的狡孔,所以擴(kuò)展函數(shù)是無法 訪問到 私有的或者受保護(hù)的成員懂诗。

?? 注意: 一個類定義有一個成員函數(shù)與一個擴(kuò)展函數(shù),而這兩個函數(shù)又有相同的接收者類型苗膝、相同的名字并且參數(shù)都沒有 或者參數(shù)類型都一樣殃恒,這種情況總是取成員函數(shù)。(成員函數(shù)優(yōu)先級高

class C {
    fun foo() { println("member") }
}

fun C.foo() { println("extension") }
// 如果這里調(diào)用 foo 方法 就會打印 member辱揭。

// 如果這里 調(diào)用 C().foo(1) 离唐,就會打印 extension。(前提是參數(shù)不一樣)
fun C.foo(i: Int) { println("extension") }

使用的話 記得引用你寫的擴(kuò)展函數(shù)地址就可以了 (import util.lastData)
如果你寫的函數(shù)比較多的話问窃,也可以 import util.*
如果想要動態(tài)的換一個名字 (import util.lastData as lastD)亥鬓,這樣的話 引用就需要 println("Kotlin".lastD())

?3.2 從java 中調(diào)用擴(kuò)展函數(shù)

?? 如果我們的 擴(kuò)展函數(shù)所在 文件位置在 Func.kt ,如果在java 中調(diào)用

Char c = Func.lastData("Kotlin")

擴(kuò)展函數(shù)的靜態(tài)性質(zhì)域庇,也決定了不可以被子類重寫嵌戈。

? 3.3 不可以被重寫的 擴(kuò)展函數(shù)

open class View{
    open fun click(){
        print("view")
    }
}

class Button : util.View() {
    override fun click() {
        print("Button")
    }
}

// 探討 擴(kuò)展函數(shù) 的不可繼承
fun View.shutOff(){
    println("view shut off")
}

fun Button.shutOff(){
    println("Button shut off")
}

// 調(diào)用語句
val view : View = Button()
view.shutOff()

輸出語句

view shut off

?? 擴(kuò)展屬性的基本使用 擴(kuò)展屬性實際上是提供一種方法來訪問屬性而已,并且這些擴(kuò)展屬性是沒有任何的狀態(tài)的较剃,因為不可能給現(xiàn)有Java庫中的對象額外添加屬性字段咕别,只是使用簡潔語法類似直接操作屬性,實際上還是方法的訪問写穴。
?? 擴(kuò)展函數(shù) 并不算是類的一部分,他是聲明在類之外的雌贱,這里的函數(shù)調(diào)用 取決于 該變量的靜態(tài)類型所決定的啊送,而不是編譯時 的數(shù)據(jù)類型所決定的偿短。
所以 擴(kuò)展函數(shù)是不可以 繼承的,因為kotlin 是 將他當(dāng)做靜態(tài)函數(shù)來看待的

如果擴(kuò)展函數(shù) 和 成員函數(shù) 簽名一樣馋没,調(diào)用的時候會優(yōu)先使用 成員函數(shù)昔逗。

4.擴(kuò)展屬性

例子 1

var StringBuffer.lastDataString : Char
    get() {
       return this.get(this.length -1 )
    }
    set(value) {
        this.setCharAt(this.length-1 ,value)
    }

?? 和擴(kuò)展函數(shù)差不多,不過擴(kuò)展屬性一定要寫 getter 方法篷朵,因為沒有默認(rèn)字段勾怒,所以沒有默認(rèn)的getter方法,同理声旺,初始化也不可以笔链,因為沒有存儲地址。

例子2

inner class CButton {
        var b: Int = a
        val MeButton.dd: Int
            get() = 1
    }

如果 不添加get 方法腮猖,編譯器 也會給我們報錯 “extension property cannot be initialized because it has no backing field” 鉴扫。

5. 擴(kuò)展函數(shù)及屬性的原理

  1. 通過對文章全邊的閱讀,我們這里還是使用 同樣的方法 閱讀 kotlin code
// 以這個擴(kuò)展函數(shù)為例
fun View.shutOff(){
        println("view shut off")
    }

以下為 kotlin code 轉(zhuǎn)換后的代碼

public final void shutOff(@NotNull View $receiver) {
      Intrinsics.checkParameterIsNotNull($receiver, "$receiver");
      String var2 = "view shut off";
      System.out.println(var2);
   }

??總結(jié):擴(kuò)展函數(shù)實際上就是一個對應(yīng)Java中的靜態(tài)函數(shù)澈缺,這個靜態(tài)函數(shù)參數(shù)為接收者類型的對象坪创,然后利用這個對象就可以訪問這個類中的成員屬性和方法了,并且最后返回一個這個接收者類型對象本身姐赡。這樣在外部感覺和使用類的成員函數(shù)是一樣的莱预。

  1. 接下來我們看下擴(kuò)展屬性。 擴(kuò)展屬性實際上就是提供某個屬性訪問的set,get方法项滑,這兩個set锁施,get方法是靜態(tài)函數(shù),同時都會傳入一個接收者類型的對象杖们,然后在其內(nèi)部用這個對象實例去訪問和修改對象所對應(yīng)的類的屬性悉抵。
// kotlin code

public final char getLastDataString(@NotNull StringBuffer $receiver) {
      Intrinsics.checkParameterIsNotNull($receiver, "$receiver");
      return $receiver.charAt($receiver.length() - 1);
   }

   public final void setLastDataString(@NotNull StringBuffer $receiver, char value) {
      Intrinsics.checkParameterIsNotNull($receiver, "$receiver");
      $receiver.setCharAt($receiver.length() - 1, value);
   }

總結(jié):

  1. 擴(kuò)展函數(shù)和成員函數(shù)使用方式類似,可以直接訪問被擴(kuò)展類的方法和屬性摘完。(原理: 傳入了一個擴(kuò)展類的對象姥饰,內(nèi)部實際上是用實例對象去訪問擴(kuò)展類的方法和屬性)
  2. 擴(kuò)展函數(shù)不能打破擴(kuò)展類的封裝性,不能像成員函數(shù)一樣直接訪問內(nèi)部私有函數(shù)和屬性孝治。(原理: 原理很簡單列粪,擴(kuò)展函數(shù)訪問實際是類的對象訪問,由于類的對象實例不能訪問內(nèi)部私有函數(shù)和屬性谈飒,自然擴(kuò)展函數(shù)也就不能訪問內(nèi)部私有函數(shù)和屬性了)
  3. 擴(kuò)展函數(shù)實際上是一個靜態(tài)函數(shù)是處于類的外部岂座,而成員函數(shù)則是類的內(nèi)部函數(shù)。
  4. ]父類成員函數(shù)可以被子類重寫杭措,而擴(kuò)展函數(shù)則不行

6. 可空接收者

fun Any?.toString(): String? {
    if (this == null) return "null"
    // 空檢測之后费什,“this”會自動轉(zhuǎn)換為非空類型,所以下面的 toString()
    // 解析為 Any 類的成員函數(shù)
    return toString()
}

??上段代碼手素,我們看到 在函數(shù)方法名 后邊和 返回值后邊都有 “鸳址?” 瘩蚪,kotlin 中問號表示可以為空,所以我們代碼中要對 null 進(jìn)行判斷稿黍。

7. 擴(kuò)展聲明為成員

??在一個類內(nèi)部你可以為另一個類聲明擴(kuò)展疹瘦。在這樣的擴(kuò)展內(nèi)部,有多個 隱式接收者 —— 其中的對象成員可以無需通過限定符訪問巡球。擴(kuò)展聲明所在的類的實例稱為 分發(fā)接收者言沐,擴(kuò)展方法調(diào)用所在的接收者類型的實例稱為 擴(kuò)展接收者.(雖然我也不懂字面意思 但是看完代碼就懂了)

class D {
    fun bar() { …… }
}

class C {
    fun baz() { …… }

    fun D.foo() {
        bar()   // 調(diào)用 D.bar
        baz()   // 調(diào)用 C.baz
    }

    fun caller(d: D) {
        d.foo()   // 調(diào)用擴(kuò)展函數(shù)
    }
}
class C {
    fun D.foo() {
        toString()         // 調(diào)用 D.toString()
        this@C.toString()  // 調(diào)用 C.toString()
    }
}

8. 中綴語法

先來看一組代碼

//普通使用字符串對比調(diào)用StringUtils.equals(strA, strB)
fun main(args: Array<String>) {
    val strA = "A"
    val strB = "B"
    if (StringUtils.equals(strA, strB)) {//這里對比字符串是了apache中的StringUtils
        println("str is the same")
    } else {
        println("str is the different")
    }
}

//利用中綴調(diào)用sameAs對比兩個字符串
fun main(args: Array<String>) {
    val strA = "A"
    val strB = "B"
    if (strA sameAs strB) {//中綴調(diào)用 sameAs
        println("str is the same")
    } else {
        println("str is the different")
    }
}

通過 中綴 語法 可以節(jié)省 部分代碼的 書寫 (類 + “.”+ 方法 的調(diào)用方式的省略)

再來看一組

//普通調(diào)用集合contains方法判斷元素是否在集合中
fun main(args: Array<String>) {
    val list = listOf(1, 3, 5, 7, 9)
    val element = 2
    if (list.contains(element)) {
        println("element: $element is into list")
    } else {
        println("element: $element is not into list")
    }
}

//利用中綴調(diào)用into判斷元素是否在集合中
fun main(args: Array<String>) {
    val list = listOf(1, 3, 5, 7, 9)
    val element = 2
    if (element into list) {
        println("element: $element is into list")
    } else {
        println("element: $element is not into list")
    }
}

中綴調(diào)用,這樣的寫法酣栈,會更加接近我們自然語言的表達(dá)险胰,更容易理解

1、前面所講into钉嘹,sameAs實際上就是函數(shù)調(diào)用鸯乃,如果把infix關(guān)鍵字去掉,那么也就純粹按照函數(shù)調(diào)用方式來跋涣。比如 1.to("A"), element.into(list)等缨睡,只有加了中綴調(diào)用的關(guān)鍵字infix后,才可以使用簡單的中綴調(diào)用例如 1 to "A", element into list等
2陈辱、并不是所有的函數(shù)都能寫成中綴調(diào)用奖年,中綴調(diào)用首先必須滿足一個條件就是函數(shù)的參數(shù)只有一個。然后再看這個函數(shù)的參與者是不是只有兩個元素沛贪,這兩個元素可以是兩個數(shù)陋守,可以是兩個對象,可以是集合等利赋。

9 解構(gòu) 使用

解構(gòu)聲明實際上就是將對象中所有屬性水评,解構(gòu)成一組屬性變量,而且這些變量可以單獨使用媚送,為什么可以單獨使用中燥,是因為每個屬性值的獲得最后都編譯成通過調(diào)用與之對應(yīng)的component()方法,每個component()方法對應(yīng)著類中每個屬性的值,然后在作用域定義各自屬性局部變量塘偎,這些局部變量存儲著各自對應(yīng)屬性的值疗涉,所以看起來變量可以單獨使用,實際上使用的是局部變量吟秩。

我們先來舉個例子

// data class 是重點

data class Student(var name: String, var age: Int, var grade: Double)

---------------

fun main(args: Array<String>) {
    val student = Student("mikyou", 18, 99.0)
    val (name, age, grade) = student//將一個student對象解構(gòu)成一組3個單獨的變量
    println("my name is $name , I'm $age years old, I get $grade score")//解構(gòu)后的3個變量可以脫離對象咱扣,直接單獨使用

}

很納悶怎么可以這么寫?我們這里通過 kotlin code 看下 真面目

public final class DestructTestKt {
   public static final void main(@NotNull String[] args) {
      Intrinsics.checkParameterIsNotNull(args, "args");
      Student student = new Student("mikyou", 18, 99.0D);
      String name = student.component1();//返回對應(yīng)就是Student中name屬性
      int age = student.component2();//返回對應(yīng)就是Student中age屬性
      double grade = student.component3();//返回對應(yīng)就是Student中屬性
      
      //注意: 這里單獨使用的name, age, grade實際上是局部變量
      String var6 = "my name is " + name + " , I'm " + age + " years old, I get " + grade + " score";
      System.out.println(var6);
   }
}

當(dāng)然 我們也可以 部分解構(gòu)涵防,不需要全部解構(gòu)對象闹伪,我們可以使用 “_” 符號表示不解構(gòu)。

val (_, age, grade) = student//下劃線_ 忽略name屬性

當(dāng)然我們也可以不加 任何東西 省略掉 name,這樣也是可以的

val (age, grade) = student//直接不寫name屬性

注意點:解構(gòu)聲明的對象類型一定是data class祭往,普通的class是不會生成對應(yīng)的component的方法伦意。

Kotlin 學(xué)習(xí)筆記(四)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末火窒,一起剝皮案震驚了整個濱河市硼补,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌熏矿,老刑警劉巖已骇,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異票编,居然都是意外死亡褪储,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進(jìn)店門慧域,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鲤竹,“玉大人,你說我怎么就攤上這事昔榴⌒猎澹” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵互订,是天一觀的道長吱肌。 經(jīng)常有香客問我,道長仰禽,這世上最難降的妖魔是什么氮墨? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮吐葵,結(jié)果婚禮上规揪,老公的妹妹穿的比我還像新娘。我一直安慰自己温峭,他們只是感情好猛铅,可當(dāng)我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著诚镰,像睡著了一般奕坟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上清笨,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天月杉,我揣著相機(jī)與錄音,去河邊找鬼抠艾。 笑死苛萎,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播腌歉,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼蛙酪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了翘盖?” 一聲冷哼從身側(cè)響起桂塞,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎馍驯,沒想到半個月后阁危,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡汰瘫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年策州,在試婚紗的時候發(fā)現(xiàn)自己被綠了目溉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖尘奏,靈堂內(nèi)的尸體忽然破棺而出簸呈,到底是詐尸還是另有隱情额港,我是刑警寧澤样屠,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站蛹磺,受9級特大地震影響粟瞬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜萤捆,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一裙品、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧俗或,春花似錦市怎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至帅腌,卻和暖如春驰弄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背速客。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工戚篙, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人溺职。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓岔擂,卻偏偏與公主長得像位喂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子乱灵,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,828評論 2 345