美文网首页
ruby记录

ruby记录

作者: rhc2008 | 来源:发表于2023-02-11 22:30 被阅读0次
    ruby for rails:
    css style: https://getbootstrap.com
    view source:gem sources
    创建 vc: rails g controller welcome index
    创建 db: bin/rails db:create (rake db:create)
    创建模型user model:rails g model user
    移植migrate: rake db:migrate
    
    打开rails终端创建sql: rails c
    选择当前数据库:User
    插入一条数据:User.create username: '343', password: '123456'
    查看所有的数据:User.all / User.all.to_a
    查看第一条记录:user=User.first
    user
    user.id/user.password/user.username
    修改一条记录:user.username = 'william'
    user.save
    删除一条记录:user.destroy
    
    
    1 irb
    2.$LOAD_PATH 加载的所有路径
      ruby 代码的查找路径为当前的$LOAD_PATH环境变量
      文件名命令规则:ruby文件的名字代表了当前class/module的名字
    3.include and  extend
      include Managemnt:include 把模块的方法转换成实例方法
      extend Managemnt:extend 把模块的方法转换成类方法
    
    5.include vs prepend
    include 把模块注入当前类的继承链后面
    prepend 把模块注入当前类的继承链前面
    
    6.Staff.ancestors  方法查找链
    
    7.class_eval
    class_eval 会重新打开当前类作用域, 对当前的类重新定义和重新操作
    「
    class_eval 是只有类才能调用的,Class#class_eval
    class_eval 是类的一个方法,类本身也是class的一个实例 ,即:所有的类class拥有 class_eval一个实例方法
    在ruby中如果描述一个对像拥有实例方法,用#来代码,如果是类方法用.来代表
    」
    
    8.instance_eval:是所有类实例的方法,打开的是当前实例作用域
    
    9. gem command
    gem list:本机安装gem
    gem install
    gem uninstall
    gem sources
    
    10.bundle gem
    gem 本身会有版本依赖问题
    bundle是一个gem,被用来管理其他gems
    bundle类似于Linux的yum,apt 是一个gems关系管理工具
    
    bundle的基本使用
    gem install bundler
    Gemfile
    bundle install/update/show/list
    
    11.require vs load
    相同点:都会在$LOAD_PATH下面查找当彰要引入的文件
    不同点:
    require调用文件时不需要".rb"的文件后缀,而load需要
    require真对同样的文件只会调用一次,load而会反复调用
    
    12. =~正则匹配
        !~没有匹配到
    
    
    show gem 
    gem env
    
    列出已知的 ruby 版本:rvm list known
    安装一个 ruby 版本:rvm install 2.2.0
    切换 ruby 版本:rvm use 2.2.0
    设置为默认版:rvm use 2.2.0 --default
    查询已经安装的ruby:rvm list
    卸载一个已安装版本:rvm remove 1.8.7
    
    建立 gemset
    rvm use 1.8.7
    rvm gemset create rails23
    以设定已建立的 gemset 做为当前环境: rvm use 1.8.7@rails23
    列出当前 ruby 的 gemset:rvm gemset list
    清空 gemset 中的 gem,清空一个 gemset 的所有 gem, 想重新安装所有 gem,可以这样
    rvm gemset empty 1.8.7@rails23
    删除一个 gemset:rvm gemset delete rails2-3
    
    项目自动加载 gemset:
    rvm install 1.9.3
    rvm use 1.9.3
    rvm gemset create rails313
    rvm use 1.9.3@rails313
    
    gem install rails --version 4.0.0 -V
    
    =begin
    1.setup:
    brew install curl
    curl -L https://get.rvm.io | bash -s stable
    rvm install 2.2.3
    2.set default version
    rvm use --default 2.2.3
    3.check out version
    rvm use 2.2.1
    4.uninstall
    rvm unistall 2.2.1
    5.debug
     irb for test
    6.
    a={"a":1,"b":2}   => {:a=>1, :b=>2}
    a={"a"=>1,"b"=>2} => {"a"=>1, "b"=>2}
    a.object_id
    
    7.! or ?
    !的方法会改变变自身
    ?的方法会返回true|false
    这只是一个约束
    在Rails中!的方法也被用来表示该方法会抛出异常
    str = "capitalize"
    str.capitalize!
    str.is_a?(String)
    8.nil
    str = nil
    str.nil?
    在ruby中nil,false都是不成立,否的意思,其他一切为true
    9.反引号
    `ls` 运行shell cmd
    10.array
    3.0.0 :035 > a = []
    3.0.0 :036 > a.push(1), => [1]
    3.0.0 :037 > a.unshift(2),=> [2, 1]
    3.0.0 :038 > a.pop ,  => 1
    3.0.0 :039 > a.shift ,=> 2
    3.0.0 :040 > a  , => []
    
    11. 方法
    a=1  # =>1
    a+2  # =>3
    在这里+只是一个方法,2是传递给方法的参数
    方法的定义和参数传递煮可以不使用小括号()
    所有方法都有返回值,方法体最后一行代码的返回值默认会做为方法的返回值,也可以显式的使用
    return 关键字
    
    12 range
    3.0.0 :042 > a=1..10,=> 1..10
    3.0.0 :043 > a.to_a.size, => 10
    3.0.0 :044 > b=1...10, => 1...10
    3.0.0 :045 > b.to_a.size, => 9
    3.0.0 :046 > b,=> 1...10
    3.0.0 :047 > c=:a..:z,=> :a..:z
    3.0.0 :048 > d=a.to_a+c.to_a
     => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, :a, :b, :c, :d, :e, :f, :g, :h, :i, :j, :k, :l, :m, :n, :o, :p, :q, :r, :s, :t, :u, :...
    
    12。自定义Block,yield 为调用外部block的关键字
    def hi name
      yiedl(name)
    end
    hi('code') {|x| "hello #{x}"}
    
    13. proc
    相当于定义了一个方法变量,可以把方法当作参数传递
    hi = proc{ |x| p "hello #{x}"}
    hi.call('world')
    
    # equal to Proc
    hi = Proc.new { |x| p "hello #{x}"}
    hi.call('world')
    
    14. if/unless
    unless false
      p 'ok'
    end
    
    a = 1 if a!=1           # if a!=1 => a=1 ,少了一个end
    b = 2 unless define?(b) # if undefine b => b =2
    
    15. ruby没有++,--操作
    
    16.变量类型
    local variables : a = 1 ,b = "hello"
    constants : Name = [ "join" ]
    global variables :$platform = "mac"
    instance variables : @name = "232"
    class variables :@@counter = 20
    
    def hello
      puts $$ #=> process id
      puts $: #-> ruby loading path
    end
    
    p Track.ancestors
    =end
    
    def process
      puts $$ #=> process id
      puts $: #-> ruby loading path
    end
    process
    
    def hi name
      yield(name)
    end
    hi('code') { |x| p "hello #{x}"}
    
    # def hi hello
    #   p hello
    # end
    # hi "hi"
    
    grp = "string".methods.grep(/case/)
    puts grp
    
    is_A = 'hello world' .is_a?(String)
    gb = 'hello world'.gsub(/world/, 'lei').upcase
    puts is_A, gb
    
    =begin
    10.times do |t|
      puts "hello  #{t}  times"
    end
    =end
    
    # 识别变量a,也可以使用%Q.%q使用的是单引号引用规则,而%Q是双引号引用规则
    a = '1234'
    puts "#{a}"
    puts %Q(#{a})   # 1234
    puts %q(#{a})   # #{a}
    
    # 在一个双引号括起的字符串内,转义字符会被解析。在一个单引号括起的字符串内,转义字符不会被解析,原样输出。
    puts %q(I can \n。)    # I can \n。
    puts %(I can \n。)     # 第一行 I can  第二行 。
    
    :cat
    puts :cat.class  # Symbol
    
    # %r() 是写正则表达式的另一种方式。
    # %q() 是写单引号字符串的另一种方式(可以是多行,这很有用)
    # %Q() 给出双引号字符串
    # %x() 是一个shell命令
    # %i() 给出一个符号数组(Ruby> = 2.0.0)
    # %s()变成foo符号(:foo)
    # %w写一个用空格而不是逗号分隔且不带引号的字符串数组
    puts %w[1 2 3]
    
    array = [1, 2, 3, 4, 5] # 也可以使用 Array.new创建新数组
    puts array[0] #=> 1
    puts array.first #=> 1
    puts array[12] #=> nil    # 数组越界不会报错
    puts array[-1] #=> 5    # 从后往前取最后一个
    puts array.last #=> 5
    
    # 也可以把if放在后面进行条件判断,unless取反
    warnings = ['Patronimic is missing', 'Address too short']
    puts("Some warnings occurred:\n" + warnings.join("\n"))  if !warnings.empty?
    puts("Some warnings occurred:\n" + warnings.join("\n"))  unless warnings.empty?
    
    (1..5).each do |counter|
      puts "iteration #{counter}"
    end
    
    # (1..5).each { |counter|
    #   puts "iteration #{counter}"
    # }
    
    
    # 传递一个block,# yield类似c语言函数指针
    def logic
      puts '{'
      yield
      puts '}'
    end
    logic { puts 'Cat1 1237' }
    
    class EnuTest
      def initialize &block
        @eb = EnuBlock.new
        yield @eb
      end
      def next
        @eb.next
      end
    end
    
    class EnuBlock
      def initialize
        @blocks = []
      end
    
      def << obj
        if obj.is_a? Proc
          @blocks << obj
        else
          @blocks << proc { obj }
        end
      end
    
      def next
        if @blocks.empty?
          raise "EOF"
        else
          @blocks.shift.call
        end
      end
    end
    
    # enu = EnuTest.new do |x|
    #   x << 1
    #   x << 3
    #   x << proc { p 'hello'}
    # end
    # enu.next
    # enu.next
    #enu.next
    
    class Eval
    end
    Eval.class_eval do
      def class_function
        p 'class_function'
      end
      def self.hi
        p 'hi'
      end
    end
    Eval.instance_eval do
      def instance_function
        p 'instance_function'
      end
      def self.hello
        p 'hello'
      end
    end
    
    def testEval
      Eval.new.class_function
      Eval.hi
      Eval.instance_function
      Eval.hello
    end
    
    module BM
      def self.include base
        p 'include ...' + base
        base.class_eval do
          set_logger :hi
        end
      end
      def hi
        p 'hi'
      end
    end
    
    class BMTest
      def self.set_logger method_name
        p "logger"
      end
      include BM
    end
    
    obj = BMTest.new
    obj.hi
    BMTest.set_logger "test"
    
    #require 'active_support/concern'
    
    module ActsAsField
      # extend ActiveSupport::Concern
      # included do
      #   @@acts_as_fields = []
      # end
      #
      def self.included base
        base.include InstanceMethods
        base.extend ClassMethods
        base.class_eval do
          @@acts_as_fields = []
        end
      end
    
      # class_methods do
      module ClassMethods
        def field name, path
          result = class_variable_get(:@@acts_as_fields)
          result << name.to_sym
          class_variable_set(:@@acts_as_fields, result)
    
          define_method(name) do
            case path
            when String
              path.split(".").inject(self.latest_data) {
                |data, key| data[key]
              }
            when Proc
              path.call(self)
            end
          end
        end
      end
    
      module InstanceMethods #
        def acts_as_fields
          self.class.class_variable_get :@@acts_as_fields
        end
      end
    end
    
    class Device
      include ActsAsField
    
      field :device_type, "device_type"
      field :battery, "data.battery"
      field :node_info, "data.node_info"
    
      field :battery_to_text, proc { |device|
        "#{device.battery}%"
      }
    
      def latest_data
        {
          "data" => {
            "node_info" => "this is a sensor",
            "battery" => 90
          },
          "device_type" => "Sensor"
        }
      end
    
    end
    
    d = Device.new
    p d.node_info
    # p d.battery_to_text
    # p d.acts_as_fields
    
    
    
    
    module RHCConcern
      def append_features base
        super
        base.instance_eval(&@_class_methods)
        base.class_eval(&@_class_eval)
      end
    
      def included base = nil, &block
        super
        @_class_eval = block
      end
    
      def class_methods &block
        @_class_methods = block
      end
    end
    
    module ActsAsField
      extend EggConcern
      included do
        @@acts_as_fields = []
      end
    
      class_methods do
        def field name, path
          result = class_variable_get(:@@acts_as_fields)
          result << name.to_sym
          class_variable_set(:@@acts_as_fields, result)
    
          define_method(name) do
            case path
            when String
              path.split(".").inject(self.latest_data) { |data, key| data[key] }
            when Proc
              path.call(self)
            end
          end
        end
      end
    
      def acts_as_fields
        self.class.class_variable_get :@@acts_as_fields
      end
    
    end
    
    class Device
      include ActsAsField
    
      field :device_type, "device_type"
      field :battery, "data.battery"
      field :node_info, "data.node_info"
    
      field :battery_to_text, proc { |device|
        "#{device.battery}%"
      }
    
      def latest_data
        {
          "data" => {
            "node_info" => "this is a sensor",
            "battery" => 90
          },
          "device_type" => "Sensor"
        }
      end
    
    end
    
    d = Device.new
    p d.node_info
    p d.battery_to_text
    p d.acts_as_fields
    
    

    相关文章

      网友评论

          本文标题:ruby记录

          本文链接:https://www.haomeiwen.com/subject/dgprkdtx.html