zoukankan      html  css  js  c++  java
  • ruby 学习精简笔记

    ============================================================================
    1、控制器中的方法可以相互调用吗
    2、控制方法中定义的@变量是不是实例变量,它貌似只能在控制器方法对应的view中应用,不能被其他view使用
    3、text_field等的传值方式,表单的传值方式
    4、activeRecord的关系映射
    ============================================================================
    ruby中的代码每个语句放在单独的行数,不需要在每个句子的末尾加上分号
    ruby的变量不需要预先声明,可以在使用的时候直接赋值,根据赋值的类型确定变量类型
    ruby字符串中含有表达式或者变量用#{表达式},如果是全局变量或实例变量则可以不用花括号

    $greeting="helllo"
    @name="prudence"
    puts "#$greeting,#@name"
    方法以def...end的形式表示
    ruby方法所返回的值,是最后一个被求值的表达式的值,可以省略return.
    ruby使用一种命名惯例来区分名称的用途:名称的第一个字符显示这个名称如何使用,
    局部变量、方法参数和方法名称都必须使用小写或者下划线,全局变量都用美元符号($)为前缀;
    而实力变量以at(@)符号开始,类变量则以两个@符号开始。最后,类名称、模块名称和常量都必须一个大写的字母开始。
    名称可以是字母、数字、下划线的任意组合,但是在@符号之后的不能是数字。按惯例,包含多个单词的实例变量名称在词与词
    之间用下划线,包含多个单词的类变量名称用混合大小写。方法名称可以以?、!、=字符结束。
    数组:a=[1,2,3] a[0]=1,
          a=%wi am ok a[0]="i" a[1]="am" a[2]="ok"        
    散列表:a={"1"=>1,"2"=>2,"3"=>3} a["1"]

    控制语句:如果只是简单的if或者while控制语句,例如只有一句,则可以先写出表达,然后再写if或者while
    如:puts "ok" if 3>2

    ruby 的一个特性:block和迭代器
    block是一个代码块可以和方法相关联,几乎和参数一样
    block只是在花括号和do...end之间的一组代码。
    {puts "hello"} #this is a block
    或者
    do
       puts "hello"
    end
    惯例多行用do...end,单行用{},一旦创建了block,就可以和方法相关联。吧block得到开始放在含有方法调用的源码的结尾处,就可以实现
    和方法的关联。比如下面的代码:
    greet{puts 'hi'}
    如果方法有参数:
    greet("jim"){puts 'hi'}
    使用ruby的yield语句,方法可以一次或者多次地调用相关联的block,可以把block想象或者比作方法调用,它调用yield语句的方法所关联的block.

    def call_block
    puts "starts of method"
    yield
    yield
    puts "end of method"
    end

    call_block {puts "in the block"}
    结果:
    starts of method
    in the block
    in the block
    end of method

    看到了吧,block中的代码随着yield的出现而得到调用。当然,我们还可以给yield提供参数,参数会传递到block中。在block中,竖线|之间给出参数名来接受这些来自yield的参数.
    def call_block
      yield("hello",99)
    end
    call_block{|str,num| ...}

    ruby库中使用大量的block来实现迭代器,迭代器是从某种(collection)如数组中返回元素的方法
    animals=%w(ant bee cat dog elk)
    animals.each {|e| puts e}
    看了上面block和yield的使用不难推理出each实际上是这样的一个方法:
    def each
       for each element #伪代码
       yield(element)
       end
    end

    5.times{puts "*"}
    1.upto(6){|i| puts i.to_s}


    定义方法:
    def ...end
    ruby可以让你指定方法参数的默认值-如果调用者在传入参数时没有明确的

    ruby可以让你指定方法的参数的默认值---如果调用者在传入参数时候没有明确指定所用的值,为此你可以使用复制操作符:
    def cool_dude(arg1="Miles",arg2="Coltrane",arg3="Roach")
      "#{ag1},#{ag2},#{ag3}."
    end
    cool_dude
    cool_dude("Bart")->Miles,Coltrane,Roach
    cool_dude("Bart","Elwood")->Bart,Coltrane,Roach
    cool_dude("Bart","Elwood","Linus")->Bart,Elwood,Linus
    可变长度的参数列表
    def varags(arg1,*rest)
      "Got #{arg1} and #{rest.join(',')}"
    end
    varags("one")->got one and two
    varags("one","two","three")->got one and two,three

    如果方法的最后一个参数是&,那么所关联的block会转换成一个Proc对象,然后赋值给这个参数。

    class TaxCalculator
     def initialize(name,&block)
       @name,@block=name,block
     end
     def get_tax(amount)
      "#@name on #{amount}=#{@block.call(amount)}"
     end
    end

    tc=TaxCalculator.new("Sales tax"){|amt| amt*0.75}
    tc.get_tax(100)   #->Sales tax on 100=7.5
    tc.get_tax(250)   #->Sales tax on 250=18.75

    方法可以返回多个值,返回多个值则是以数组的形式组织的
    def meth_three
     100.times do |num|
      square=num*num
      return num,square if square>1000
      end
    end
    meth_three ->[32,1024]
    num,square=meth_three ->num=32,square=1024

  • 相关阅读:
    第二次作业循环语句
    c语言01次作业分支,顺序结构
    PAT 1027. Colors in Mars
    PAT 1026 Table Tennis
    PAT 1035 Password
    PAT 1038. Recover the Smallest Number
    PAT 1028 List Sorting (25)
    PAT 1041 Be Unique (20)
    PAT 1025 PAT Ranking
    1037. Magic Coupon
  • 原文地址:https://www.cnblogs.com/shineqiujuan/p/1748276.html
Copyright © 2011-2022 走看看