在Ruby中有类似JavaScript的东西吗?

时间:2017-02-15 11:09:31

标签: ruby

我想知道在Ruby中声明之前是否可以使用变量和方法。是否有类似于在JavaScript中提升的内容?

CREATE TABLE #TestingTesting123 (Id bigint, WkDay varchar(30), Admittime varchar(5), primary key(Id))
    INSERT INTO #TestingTesting123 (Id, WkDay, Admittime)
        SELECT  r.Id, 
            datename(dw, r.AdmitDate) As WkDay, 
            CASE
                WHEN r.Admittime = ':'
                    THEN '00:00'
                ELSE     
                    isnull(LEFT(r.Admittime,2),0) + ':00 '
                END as AdmitTime
        FROM registrations r
        WHERE r.AdmitDate between @fromdate AND  @todate                    
            AND r.registrationtypeid =  @RegistrationTypeId
        ORDER BY AdmitTime Asc

-- table with all hours in day
declare @Hours table
(
    T_Hour varchar(5)
)

declare @i smallint
set @i = 0
while @i < 24
begin
    insert into @Hours
    select right('00' + cast(@i as varchar), 2) + ':00'

    set @i = @i + 1
end

-- result query
select 
    T_Hour,
    ISNULL(SUM(case when WkDay = 'Sunday' then CountValue else 0 end), 0) as Sunday,
    ISNULL(SUM(case when WkDay = 'Monday' then CountValue else 0 end), 0) as Monday,
    ISNULL(SUM(case when WkDay = 'Tuesday' then CountValue else 0 end), 0) as Tuesday,
    ISNULL(SUM(case when WkDay = 'Wednesday' then CountValue else 0 end), 0) as Wednesday,
    ISNULL(SUM(case when WkDay = 'Thursday' then CountValue else 0 end), 0) as Thursday,
    ISNULL(SUM(case when WkDay = 'Friday' then CountValue else 0 end), 0) as Friday,
    ISNULL(SUM(case when WkDay = 'Saturday' then CountValue else 0 end), 0) as Saturday
from @Hours
    left outer join 
    (
        select WkDay, Admittime, count(Id) as CountValue                
        from #TestingTesting123
        group by WkDay, Admittime
    ) T 
    on T_Hour = Admittime  
group by T_Hour      

2 个答案:

答案 0 :(得分:9)

  

我想知道在Ruby中声明之前是否可以使用变量和方法。

变量不需要在Ruby中声明,因此问题的一部分没有意义。变量在首次分配时就会存在,或者在局部变量的情况下,当它们的第一个赋值被解析时

方法已定义,未声明。方法定义就像任何其他代码一样是一段代码。需要执行才能生效。您不能调用不存在的方法,并且方法仅在其定义执行后才存在。

  

是否有类似于在JavaScript中提升的内容?

没有

def calcArea
  getWidth * getHeight
end

def getWidth
  @w
end
def getHeight
  @h
end
@w = 10
@h = 20

p calcArea

这很好用,但它与吊装无关。您只能在定义后调用calcArea,这样就完全可以了。 calcArea调用getWidthgetHeight,但只有当calcArea本身被调用时才会调用,这是在定义所有方法之后,所以没关系。 getWidthgetHeight访问@w@h,但同样,getWidthgetHeight被调用@w已经分配了@h,所以也没关系。 (即使他们没有被分配,访问它们仍然不是错误,访问不存在的实例变量只是评估为nil;显然,你会得到一个{ {1}}尝试在NoMethodError上调用*,但这与为不存在的变量获取nil非常不同。)

关于编码风格的一些注意事项:

  • Ruby使用NameError作为方法,参数,局部变量,实例变量,类变量和全局变量。
  • Ruby不会为getter使用snake_case前缀。
  • 应将琐碎的getter命名为与实例变量相同。
  • 此外,get基本上是该区域的吸气剂,所以它也应该没有前缀。
  • 方法定义后应该有一个空行。

因此,根据Ruby社区风格,您的代码应如下所示:

calcArea

如果这是模块或类定义的一部分,那么您可以使用def area width * height end def width @width end def height @height end @width = 10 @height = 20 p area 自动生成getter,使用attr_reader生成setter:

attr_writer

答案 1 :(得分:1)

您的示例在Ruby中运行良好。

在JavaScript中,提升意味着Javascript将您的变量声明移动到当前范围的顶部。根据这个article,Ruby也做了某种提升。但是,如果它与Javascript版本具有相同的意义,那就值得商榷(见评论)。

您的示例可能应该起作用的另一个原因是变量@w@hnil,除非未定义,并且因为在调用之前已经定义了它们calcArea,他们有实际价值。