Pry使用教程

一拍屑、pry是什么

Pry是一個非常強大的可以替代Ruby自帶irb的控制臺叼耙。
它有非常多的先進的功能。

  • 源代碼查看(安裝 pry-doc gem 還可以查看C語言源代碼)
  • 文檔瀏覽
  • 在線幫助系統(tǒng)
  • 可以在編輯器中編輯方法(edit Class#method)
  • 語法高亮
  • 各種命令集成(啟動編輯器尔觉,運行g(shù)it,執(zhí)行rake)
  • linux命令集成(可以使用 cd, ls 等)
  • 能夠查看和回放歷史

二闷板、根據(jù)實例介紹Pry

Pry關(guān)聯(lián)的幾個gem

pry (0.9.12.6)
pry-debugger (0.2.2)
pry-doc (0.6.0)
pry-rails (0.3.1)

一個小例子

    require 'active_record'
require 'arel'

class TestCount
  PUBLIC_STATUS = 4

  def initialize
    ActiveRecord::Base.establish_connection(
      :adapter => 'mysql2',
      :host    => 'localhost',
      :username => 'root',
      :database => 'tao800_test8'
    )

    Arel::Table.engine = ActiveRecord::Base

    @x = 123
  end

  def self.my_to_sql
    binding.pry
    id = ::Arel::Nodes::SqlLiteral.new("id")
    id.count.to_sql
  end

  def say_hello_to_pry
    binding.pry
    p "Fine, pry"
  end
end

aa = TestCount.new
aa.say_hello_to_pry

TestCount.my_to_sql

-ls 命令

ls shows you which methods, constants and variables are accessible to Pry. By
default it shows you the local variables defined in the current shell, and any
public methods or instance variables defined on the current object. 

  -m, --methods               Show public methods defined on the Object (default)
  -M, --instance-methods      Show methods defined in a Module or Class
  -p, --ppp                   Show public, protected (in yellow) and private (in green) methods
  -G, --grep                  Filter output by regular expression

-cd 命令

Move into new context (object or scope). As in UNIX shells use `cd ..` to go
back, `cd /` to return to Pry top-level and `cd -` to toggle between last two
scopes. Complex syntax (e.g `cd ../@x/y`) also supported.

cd @x
cd ..
cd /
cd -

-whereami 命令

Describe the current location. If you use `binding.pry` inside a method then
whereami will print out the source for that method.

-nesting 命令

Show nesting information.

-step 命令

Step execution forward. By default, moves a single step.

Examples:

    step                           Move a single step forward.
    step 5                         Execute the next 5 steps.

-jump-to 命令

Jump to a binding further up the stack, popping all bindings below. 

實戰(zhàn)

arel (master) $ pry my_test/test_count.rb

From: (pry) @ line 9 TestCount#initialize:

     8: def initialize
 =>  9:   binding.pry
    10:   ActiveRecord::Base.establish_connection(
    11:     :adapter => 'mysql2',
    12:     :host    => 'localhost',
    13:     :username => 'root',
    14:     :database => 'tao800_test8'
    15:   )
    16:
    17:   Arel::Table.engine = ActiveRecord::Base
    18:
    19:   binding.pry
    20:   @x = 123
    21: end

[1] pry(#<TestCount>)> step

From: (pry) @ line 10 TestCount#initialize:

     8: def initialize
     9:   binding.pry
 => 10:   ActiveRecord::Base.establish_connection(
    11:     :adapter => 'mysql2',
    12:     :host    => 'localhost',
    13:     :username => 'root',
    14:     :database => 'tao800_test8'
    15:   )
    16:
    17:   Arel::Table.engine = ActiveRecord::Base
    18:
    19:   binding.pry
    20:   @x = 123
    21: end

[1] pry(#<TestCount>)> step

From: /Users/wanghao/.rvm/gems/ruby-2.1.1@others/gems/activerecord-4.2.1/lib/active_record/base.rb @ line 1 :

 => 1: require 'yaml'
    2: require 'set'
    3: require 'active_support/benchmarkable'
    4: require 'active_support/dependencies'
    5: require 'active_support/descendants_tracker'
    6: require 'active_support/time'

[1] pry(main)> step

From: /Users/wanghao/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/rubygems/core_ext/kernel_require.rb @ line 39 Kernel#require:

    34:   #
    35:   # The normal <tt>require</tt> functionality of returning false if
    36:   # that file has already been loaded is preserved.
    37:
    38:   def require path
 => 39:     RUBYGEMS_ACTIVATION_MONITOR.enter
    40:
    41:     path = path.to_path if path.respond_to? :to_path
    42:
    43:     spec = Gem.find_unresolved_default_spec(path)
    44:     if spec

[1] pry(main)> step

From: /Users/wanghao/.rvm/rubies/ruby-2.1.1/lib/ruby/2.1.0/monitor.rb @ line 184 MonitorMixin#mon_enter:

    183: def mon_enter
 => 184:   if @mon_owner != Thread.current
    185:     @mon_mutex.lock
    186:     @mon_owner = Thread.current
    187:   end
    188:   @mon_count += 1
    189: end

[1] pry(#<Monitor>)> nesting
Nesting status:
--
0. #<Monitor> (Pry top level)
[2] pry(#<Monitor>)> @mon_owner
=> nil
[3] pry(#<Monitor>)> c

From: (pry) @ line 19 TestCount#initialize:

     8: def initialize
     9:   binding.pry
    10:   ActiveRecord::Base.establish_connection(
    11:     :adapter => 'mysql2',
    12:     :host    => 'localhost',
    13:     :username => 'root',
    14:     :database => 'tao800_test8'
    15:   )
    16:
    17:   Arel::Table.engine = ActiveRecord::Base
    18:
 => 19:   binding.pry
    20:   @x = 123
    21: end

[1] pry(#<TestCount>)> Arel::Table.engine
=> ActiveRecord::Base
[2] pry(#<TestCount>)> ls
TestCount#methods: say_hello_to_pry
locals: _  __  _dir_  _ex_  _file_  _in_  _out_  _pry_
[3] pry(#<TestCount>)> ls -i

[4] pry(#<TestCount>)> ls -m
TestCount#methods: say_hello_to_pry
[5] pry(#<TestCount>)> cd Arel::Table
[6] pry(Arel::Table):1> show-source

From: /Users/wanghao/Project/arel/lib/arel/table.rb @ line 2:
Class name: Arel::Table
Number of lines: 123

class Table
  include Arel::Crud
  include Arel::FactoryMethods

  @engine = nil
  class << self; attr_accessor :engine; end

  attr_accessor :name, :aliases, :table_alias

  # TableAlias and Table both have a #table_name which is the name of the underlying table
  alias :table_name :name

  def initialize(name, as: nil, type_caster: nil)
    @name    = name.to_s
    @columns = nil
    @aliases = []
    @type_caster = type_caster

    # Sometime AR sends an :as parameter to table, to let the table know
    # that it is an Alias.  We may want to override new, and return a
    # TableAlias node?
    if as.to_s == @name
      as = nil
    end
    @table_alias = as
  end

  def alias name = "#{self.name}_2"
    Nodes::TableAlias.new(self, name).tap do |node|
      @aliases << node
    end
  end

  def from
    SelectManager.new(self)
  end

  def join relation, klass = Nodes::InnerJoin
    return from unless relation

    case relation
    when String, Nodes::SqlLiteral
      raise if relation.empty?
      klass = Nodes::StringJoin
    end

    from.join(relation, klass)
  end

  def outer_join relation
    join(relation, Nodes::OuterJoin)
  end

  def group *columns
    from.group(*columns)
  end

  def order *expr
    from.order(*expr)
  end

  def where condition
    from.where condition
  end

  def project *things
    from.project(*things)
  end

  def take amount
    from.take amount
  end

  def skip amount
    from.skip amount
  end

  def having expr
    from.having expr
  end

  def [] name
    ::Arel::Attribute.new self, name
  end

  def hash
    # Perf note: aliases and table alias is excluded from the hash
    #  aliases can have a loop back to this table breaking hashes in parent
    #  relations, for the vast majority of cases @name is unique to a query
    @name.hash
  end

  def eql? other
    self.class == other.class &&
      self.name == other.name &&
      self.aliases == other.aliases &&
      self.table_alias == other.table_alias
  end
  alias :== :eql?

  def type_cast_for_database(attribute_name, value)
    type_caster.type_cast_for_database(attribute_name, value)
  end

  def able_to_type_cast?
    !type_caster.nil?
  end

  protected

  attr_reader :type_caster

  private

  def attributes_for columns
    return nil unless columns

    columns.map do |column|
      Attributes.for(column).new self, column.name.to_sym
    end
  end

end
[7] pry(Arel::Table):1> show-source -l

From: /Users/wanghao/Project/arel/lib/arel/table.rb @ line 2:
Class name: Arel::Table
Number of lines: 123

  2: class Table
  3:   include Arel::Crud
  4:   include Arel::FactoryMethods
  5:
  6:   @engine = nil
  7:   class << self; attr_accessor :engine; end
  8:
  9:   attr_accessor :name, :aliases, :table_alias
 10:
 11:   # TableAlias and Table both have a #table_name which is the name of the underlying table
 12:   alias :table_name :name
 13:
 14:   def initialize(name, as: nil, type_caster: nil)
 15:     @name    = name.to_s
 16:     @columns = nil
 17:     @aliases = []
 18:     @type_caster = type_caster
 19:
 20:     # Sometime AR sends an :as parameter to table, to let the table know
 21:     # that it is an Alias.  We may want to override new, and return a
 22:     # TableAlias node?
 23:     if as.to_s == @name
 24:       as = nil
 25:     end
 26:     @table_alias = as
 27:   end
 28:
 29:   def alias name = "#{self.name}_2"
 30:     Nodes::TableAlias.new(self, name).tap do |node|
 31:       @aliases << node
 32:     end
 33:   end
 34:
 35:   def from
 36:     SelectManager.new(self)
 37:   end
 38:
 39:   def join relation, klass = Nodes::InnerJoin
 40:     return from unless relation
 41:
 42:     case relation
 43:     when String, Nodes::SqlLiteral
 44:       raise if relation.empty?
 45:       klass = Nodes::StringJoin
 46:     end
 47:
 48:     from.join(relation, klass)
 49:   end
 50:
 51:   def outer_join relation
 52:     join(relation, Nodes::OuterJoin)
 53:   end
 54:
 55:   def group *columns
 56:     from.group(*columns)
 57:   end
 58:
 59:   def order *expr
 60:     from.order(*expr)
 61:   end
 62:
 63:   def where condition
 64:     from.where condition
 65:   end
 66:
 67:   def project *things
 68:     from.project(*things)
 69:   end
 70:
 71:   def take amount
 72:     from.take amount
 73:   end
 74:
 75:   def skip amount
 76:     from.skip amount
 77:   end
 78:
 79:   def having expr
 80:     from.having expr
 81:   end
 82:
 83:   def [] name
 84:     ::Arel::Attribute.new self, name
 85:   end
 86:
[8] pry(Arel::Table):1> whereami
Inside Arel::Table.
[9] pry(Arel::Table):1> nesting
Nesting status:
--
0. #<TestCount> (Pry top level)
1. Arel::Table
[10] pry(Arel::Table):1> jump-to 0
[11] pry(#<TestCount>)> whereami

From: (pry) @ line 19 TestCount#initialize:

     8: def initialize
     9:   binding.pry
    10:   ActiveRecord::Base.establish_connection(
    11:     :adapter => 'mysql2',
    12:     :host    => 'localhost',
    13:     :username => 'root',
    14:     :database => 'tao800_test8'
    15:   )
    16:
    17:   Arel::Table.engine = ActiveRecord::Base
    18:
 => 19:   binding.pry
    20:   @x = 123
    21: end

[12] pry(#<TestCount>)> next

From: (pry) @ line 20 TestCount#initialize:

     8: def initialize
     9:   binding.pry
    10:   ActiveRecord::Base.establish_connection(
    11:     :adapter => 'mysql2',
    12:     :host    => 'localhost',
    13:     :username => 'root',
    14:     :database => 'tao800_test8'
    15:   )
    16:
    17:   Arel::Table.engine = ActiveRecord::Base
    18:
    19:   binding.pry
 => 20:   @x = 123
    21: end

[12] pry(#<TestCount>)> next

From: /Users/wanghao/.rvm/gems/ruby-2.1.1@others/gems/pry-0.10.1/lib/pry/pry_instance.rb @ line 356 Pry#evaluate_ruby:

    351: def evaluate_ruby(code)
    352:   inject_sticky_locals!
    353:   exec_hook :before_eval, code, self
    354:
    355:   result = current_binding.eval(code, Pry.eval_path, Pry.current_line)
 => 356:   set_last_result(result, code)
    357: ensure
    358:   update_input_history(code)
    359:   exec_hook :after_eval, result, self
    360: end

[12] pry(#<Pry>)> continue

From: (pry) @ line 29 TestCount#say_hello_to_pry:

    28: def say_hello_to_pry
 => 29:   binding.pry
    30:   puts "Fine, pry"
    31:   id = ::Arel::Nodes::SqlLiteral.new("id")
    32:   binding.pry
    33:   id.count.to_sql
    34: end

[1] pry(#<TestCount>)> step

From: (pry) @ line 30 TestCount#say_hello_to_pry:

    28: def say_hello_to_pry
    29:   binding.pry
 => 30:   puts "Fine, pry"
    31:   id = ::Arel::Nodes::SqlLiteral.new("id")
    32:   binding.pry
    33:   id.count.to_sql
    34: end

[1] pry(#<TestCount>)> step
Fine, pry

From: (pry) @ line 31 TestCount#say_hello_to_pry:

    28: def say_hello_to_pry
    29:   binding.pry
    30:   puts "Fine, pry"
 => 31:   id = ::Arel::Nodes::SqlLiteral.new("id")
    32:   binding.pry
    33:   id.count.to_sql
    34: end

[1] pry(#<TestCount>)> id
=> nil
[2] pry(#<TestCount>)> cd ::Arel::Nodes::SqlLiteral
[3] pry(Arel::Nodes::SqlLiteral):1> show-source

From: /Users/wanghao/Project/arel/lib/arel/nodes/sql_literal.rb @ line 3:
Class name: Arel::Nodes::SqlLiteral
Number of lines: 10

class SqlLiteral < String
  include Arel::Expressions
  include Arel::Predications
  include Arel::AliasPredication
  include Arel::OrderPredications

  def encode_with(coder)
    coder.scalar = self.to_s
  end
end
[4] pry(Arel::Nodes::SqlLiteral):1> nesting
Nesting status:
--
0. #<TestCount> (Pry top level)
1. Arel::Nodes::SqlLiteral
[5] pry(Arel::Nodes::SqlLiteral):1> jump-to 0
[6] pry(#<TestCount>)> step

From: (pry) @ line 32 TestCount#say_hello_to_pry:

    28: def say_hello_to_pry
    29:   binding.pry
    30:   puts "Fine, pry"
    31:   id = ::Arel::Nodes::SqlLiteral.new("id")
 => 32:   binding.pry
    33:   id.count.to_sql
    34: end

[6] pry(#<TestCount>)> id
=> "id"
[7] pry(#<TestCount>)> step

From: /Users/wanghao/.rvm/gems/ruby-2.1.1@others/gems/pry-0.10.1/lib/pry/core_extensions.rb @ line 42 Object#pry:

    41: def pry(object=nil, hash={})
 => 42:   if object.nil? || Hash === object
    43:     Pry.start(self, object || {})
    44:   else
    45:     Pry.start(object, hash)
    46:   end
    47: end

[7] pry(#<Binding>)> cd ..
[8] pry(#<Binding>)> nesting
Nesting status:
--
0. #<Binding> (Pry top level)
[9] pry(#<Binding>)> jump-to -1
Invalid nest level. Must be between 0 and -1. Got -1.
[10] pry(#<Binding>)> continue

From: (pry) @ line 32 TestCount#say_hello_to_pry:

    28: def say_hello_to_pry
    29:   binding.pry
    30:   puts "Fine, pry"
    31:   id = ::Arel::Nodes::SqlLiteral.new("id")
 => 32:   binding.pry
    33:   id.count.to_sql
    34: end

[1] pry(#<TestCount>)> id
=> "id"
[2] pry(#<TestCount>)> id.class
=> Arel::Nodes::SqlLiteral
[3] pry(#<TestCount>)> id.count

From: /Users/wanghao/Project/arel/lib/arel/expressions.rb @ line 4 Arel::Expressions#count:

    3: def count distinct = false
 => 4:   binding.pry
    5:   Nodes::Count.new [self], distinct
    6: end

[1] pry("id")> whereami
whereami
[1] pry("id")> whereami
whereami
[1] pry("id")> whereami -l

From: /Users/wanghao/Project/arel/lib/arel/expressions.rb @ line 4 Arel::Expressions#count:

 => 4:       binding.pry

[2] pry("id")> whereami -l 20

From: /Users/wanghao/Project/arel/lib/arel/expressions.rb @ line 4 Arel::Expressions#count:

 => 4:       binding.pry

[3] pry("id")> whereami 20

From: /Users/wanghao/Project/arel/lib/arel/expressions.rb @ line 4 Arel::Expressions#count:

     1: module Arel
     2:   module Expressions
     3:     def count distinct = false
 =>  4:       binding.pry
     5:       Nodes::Count.new [self], distinct
     6:     end
     7:
     8:     def sum
     9:       Nodes::Sum.new [self]
    10:     end
    11:
    12:     def maximum
    13:       Nodes::Max.new [self]
    14:     end
    15:
    16:     def minimum
    17:       Nodes::Min.new [self]
    18:     end
    19:
    20:     def average
    21:       Nodes::Avg.new [self]
    22:     end
    23:
    24:     def extract field

[4] pry("id")> self
=> "id"
[5] pry("id")> distinct
=> false
[6] pry("id")> cd Nodes::Count
[7] pry(Arel::Nodes::Count):1> whereami
Inside Arel::Nodes::Count.
[8] pry(Arel::Nodes::Count):1> show-source

From: /Users/wanghao/Project/arel/lib/arel/nodes/count.rb @ line 3:
Class name: Arel::Nodes::Count
Number of lines: 6

class Count < Arel::Nodes::Function
  def initialize expr, distinct = false, aliaz = nil
    super(expr, aliaz)
    @distinct = distinct
  end
end
[9] pry(Arel::Nodes::Count):1> cd Arel::Nodes::Function
[10] pry(Arel::Nodes::Function):2> show-source

From: /Users/wanghao/Project/arel/lib/arel/nodes/function.rb @ line 3:
Class name: Arel::Nodes::Function
Number of lines: 28

class Function < Arel::Nodes::Node
  include Arel::Predications
  include Arel::WindowPredications
  attr_accessor :expressions, :alias, :distinct

  def initialize expr, aliaz = nil
    super()
    @expressions = expr
    @alias       = aliaz && SqlLiteral.new(aliaz)
    @distinct    = false
  end

  def as aliaz
    self.alias = SqlLiteral.new(aliaz)
    self
  end

  def hash
    [@expressions, @alias, @distinct].hash
  end

  def eql? other
    self.class == other.class &&
      self.expressions == other.expressions &&
      self.alias == other.alias &&
      self.distinct == other.distinct
  end
end
[11] pry(Arel::Nodes::Function):2> cd Arel::Nodes::Node
[12] pry(Arel::Nodes::Node):3> show-source

From: /Users/wanghao/Project/arel/lib/arel/nodes/node.rb @ line 7:
Class name: Arel::Nodes::Node
Number of lines: 52

class Node
  include Arel::FactoryMethods
  include Enumerable

  if $DEBUG
    def _caller
      @caller
    end

    def initialize
      @caller = caller.dup
    end
  end

From: /Users/wanghao/Project/arel/lib/arel/nodes/node.rb @ line 7:
Class name: Arel::Nodes::Node
Number of lines: 52

class Node
  include Arel::FactoryMethods
  include Enumerable

  if $DEBUG
    def _caller
      @caller
    end

    def initialize
      @caller = caller.dup
    end
  end

  ###
  # Factory method to create a Nodes::Not node that has the recipient of
  # the caller as a child.
  def not
    Nodes::Not.new self
  end

From: /Users/wanghao/Project/arel/lib/arel/nodes/node.rb @ line 7:
Class name: Arel::Nodes::Node
Number of lines: 52

class Node
  include Arel::FactoryMethods
  include Enumerable

  if $DEBUG
    def _caller
      @caller
    end

    def initialize
      @caller = caller.dup
    end
  end

  ###
  # Factory method to create a Nodes::Not node that has the recipient of
  # the caller as a child.
  def not
    Nodes::Not.new self
  end

  ###
  # Factory method to create a Nodes::Grouping node that has an Nodes::Or
  # node as a child.
  def or right
    Nodes::Grouping.new Nodes::Or.new(self, right)
  end
[13] pry(Arel::Nodes::Node):3> nesting
Nesting status:
--
0. "id" (Pry top level)
1. Arel::Nodes::Count
2. Arel::Nodes::Function
3. Arel::Nodes::Node
[14] pry(Arel::Nodes::Node):3> jump-to 2
[15] pry(Arel::Nodes::Function):2> show-source

From: /Users/wanghao/Project/arel/lib/arel/nodes/function.rb @ line 3:
Class name: Arel::Nodes::Function
Number of lines: 28

class Function < Arel::Nodes::Node
  include Arel::Predications
  include Arel::WindowPredications
  attr_accessor :expressions, :alias, :distinct

  def initialize expr, aliaz = nil
    super()
    @expressions = expr
    @alias       = aliaz && SqlLiteral.new(aliaz)
    @distinct    = false
  end

  def as aliaz
    self.alias = SqlLiteral.new(aliaz)
    self
  end

  def hash
    [@expressions, @alias, @distinct].hash
  end

  def eql? other
    self.class == other.class &&
      self.expressions == other.expressions &&
      self.alias == other.alias &&
      self.distinct == other.distinct
  end
end
[16] pry(Arel::Nodes::Function):2> nesting
Nesting status:
--
0. "id" (Pry top level)
1. Arel::Nodes::Count
2. Arel::Nodes::Function
[17] pry(Arel::Nodes::Function):2> jump to 1
NoMethodError: undefined method `to' for Arel::Nodes::Function:Class
from (pry):46:in `__binding__'
[18] pry(Arel::Nodes::Function):2> jump-to 1
[19] pry(Arel::Nodes::Count):1> whereami
Inside Arel::Nodes::Count.
[20] pry(Arel::Nodes::Count):1> show-source

From: /Users/wanghao/Project/arel/lib/arel/nodes/count.rb @ line 3:
Class name: Arel::Nodes::Count
Number of lines: 6

class Count < Arel::Nodes::Function
  def initialize expr, distinct = false, aliaz = nil
    super(expr, aliaz)
    @distinct = distinct
  end
end
[21] pry(Arel::Nodes::Count):1> continue
Error: Cannot find local context. Did you use `binding.pry`?
[22] pry(Arel::Nodes::Count):1> jump-to 0
[23] pry("id")> whereami

From: /Users/wanghao/Project/arel/lib/arel/expressions.rb @ line 4 Arel::Expressions#count:

    3: def count distinct = false
 => 4:   binding.pry
    5:   Nodes::Count.new [self], distinct
    6: end

[24] pry("id")> Nodes::Count.new("name")
=> #<Arel::Nodes::Count:0x000001065be670 @alias=nil, @distinct=false, @expressions="name">
[25] pry("id")> Nodes::Count.new("name").to_sql
NoMethodError: undefined method `each_with_index' for "name":String
from /Users/wanghao/Project/arel/lib/arel/visitors/to_sql.rb:790:in `inject_join'
[26] pry("id")> Nodes::Count.new("name").class
=> Arel::Nodes::Count
[27] pry("id")> continue
=> #<Arel::Nodes::Count:0x00000106485088 @alias=nil, @distinct=false, @expressions=["id"]>
[4] pry(#<TestCount>)> continue

From: /Users/wanghao/Project/arel/lib/arel/expressions.rb @ line 4 Arel::Expressions#count:

    3: def count distinct = false
 => 4:   binding.pry
    5:   Nodes::Count.new [self], distinct
    6: end

[1] pry("id")> continue
heihei
self.my_to_sql
You have new mail in /var/mail/wanghao
參考

https://github.com/pry/pry

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市院塞,隨后出現(xiàn)的幾起案子遮晚,更是在濱河造成了極大的恐慌,老刑警劉巖迫悠,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹏漆,死亡現(xiàn)場離奇詭異,居然都是意外死亡创泄,警方通過查閱死者的電腦和手機艺玲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鞠抑,“玉大人饭聚,你說我怎么就攤上這事「樽荆” “怎么了秒梳?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長箕速。 經(jīng)常有香客問我酪碘,道長,這世上最難降的妖魔是什么盐茎? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任兴垦,我火速辦了婚禮,結(jié)果婚禮上字柠,老公的妹妹穿的比我還像新娘探越。我一直安慰自己,他們只是感情好窑业,可當(dāng)我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布钦幔。 她就那樣靜靜地躺著,像睡著了一般常柄。 火紅的嫁衣襯著肌膚如雪鲤氢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天西潘,我揣著相機與錄音铜异,去河邊找鬼。 笑死秸架,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的咆蒿。 我是一名探鬼主播东抹,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蚂子,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了缭黔?” 一聲冷哼從身側(cè)響起食茎,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎馏谨,沒想到半個月后别渔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡惧互,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年哎媚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喊儡。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡拨与,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出艾猜,到底是詐尸還是另有隱情买喧,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布匆赃,位于F島的核電站淤毛,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏算柳。R本人自食惡果不足惜低淡,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望埠居。 院中可真熱鬧查牌,春花似錦、人聲如沸滥壕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绎橘。三九已至胁孙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間称鳞,已是汗流浹背涮较。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留冈止,地道東北人狂票。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像熙暴,于是被迫代替她去往敵國和親闺属。 傳聞我的和親對象是個殘疾皇子慌盯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,614評論 2 353

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