我想知道在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
答案 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
调用getWidth
和getHeight
,但只有当calcArea
本身被调用时才会调用,这是在定义所有方法之后,所以没关系。 getWidth
和getHeight
访问@w
和@h
,但同样,getWidth
和getHeight
被调用@w
已经分配了@h
,所以也没关系。 (即使他们没有被分配,访问它们仍然不是错误,访问不存在的实例变量只是评估为nil
;显然,你会得到一个{ {1}}尝试在NoMethodError
上调用*
,但这与为不存在的变量获取nil
非常不同。)
关于编码风格的一些注意事项:
NameError
作为方法,参数,局部变量,实例变量,类变量和全局变量。snake_case
前缀。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
和@h
是nil
,除非未定义,并且因为在调用之前已经定义了它们calcArea
,他们有实际价值。