跳至内容

编码风格

此风格用于标准库。您可以在自己的项目中使用它,使其对其他开发者更加熟悉。

命名

类型名称使用帕斯卡命名法。例如

class ParseError < Exception
end

module HTTP
  class RequestHandler
  end
end

alias NumericValue = Float32 | Float64 | Int32 | Int64

lib LibYAML
end

struct TagDirective
end

enum Time::DayOfWeek
end

方法名称使用蛇形命名法。例如

class Person
  def first_name
  end

  def date_of_birth
  end

  def homepage_url
  end
end

变量名称使用蛇形命名法。例如

class Greeting
  @@default_greeting = "Hello world"

  def initialize(@custom_greeting = nil)
  end

  def print_greeting
    greeting = @custom_greeting || @@default_greeting
    puts greeting
  end
end

常量使用全大写蛇形命名法。例如

LUCKY_NUMBERS     = [3, 7, 11]
DOCUMENTATION_URL = "https://crystal.ruby-lang.org.cn/docs"

异常消息使用句子命名法,但代码或缩写可能以小写字母开头。例如

raise ArgumentError.new("Cannot create a string with a null pointer")
raise RuntimeError.new("getpeername failed")
{% raise "Expected size to be an integer literal" %}

缩写

在类名中,缩写全部大写。例如,HTTPLibXML

在方法名中,缩写全部小写。例如 #from_json#to_io

Lib 名称以 Lib 为前缀。例如:LibCLibEvent2

目录和文件名

在一个项目中

  • / 包含自述文件、任何项目配置(例如 CI 或编辑器配置)以及任何其他项目级文档(例如变更日志或贡献指南)。
  • src/ 包含项目的源代码。
  • spec/ 包含 项目的规格,可以使用 crystal spec 运行。
  • bin/ 包含任何可执行文件。

文件路径与它们所包含内容的命名空间匹配。文件以它们定义的类或命名空间命名,使用蛇形命名法

例如,HTTP::WebSocket 定义在 src/http/web_socket.cr 中。

缩进

使用两个空格缩进命名空间、方法、代码块或其他嵌套上下文中的代码。例如

module Scorecard
  class Parser
    def parse(score_text)
      begin
        score_text.scan(SCORE_PATTERN) do |match|
          handle_match(match)
        end
      rescue err : ParseError
        # handle error ...
      end
    end
  end
end

在一个类中,使用一个换行符分隔方法定义、常量和内部类定义。例如

module Money
  CURRENCIES = {
    "EUR" => 1.0,
    "ARS" => 10.55,
    "USD" => 1.12,
    "JPY" => 134.15,
  }

  class Amount
    getter :currency, :value

    def initialize(@currency, @value)
    end
  end

  class CurrencyConversion
    def initialize(@amount, @target_currency)
    end

    def amount
      # implement conversion ...
    end
  end
end